HDU2609(字符串的最小表示法)

来源:互联网 发布:coc闪电劈防空数据 编辑:程序博客网 时间:2024/06/05 17:24

原题链接

字符串的最小表示法

#include<iostream>#include<cstring>#include<set>using namespace std;char num[10005];int work(int m,char str[])//返回最小截取的下标位置{    int i,j,l;    i=0;j=1;    while(i<m&&j<m)    {        for ( l=0;l<m;l++)            if (str[(i+l)%m]!=str[(j+l)%m]) break;        if (l>m) break;        if(str[(i+l)%m]>str[(j+l)%m])            i=i+l+1;        else            j=j+l+1;        if (i==j) j=i+1;    }    return min(i,j);}int main(){    int n;    while(cin>>n)    {        set <string> S;//涉及去重问题,使用set更简单        while(n--)        {            cin>>num;            int cut=work(strlen(num),num);            string s=(num+cut);            num[cut]='\0';            s+=num;            S.insert(s);        }        cout<<S.size()<<endl;    }    return 0;}