HDU 3746 Cyclic Nacklace

题意

给你一个字符串,让这个字符串变成一个至少有两个循环节的字符串,问至少添加几个字符,添加字符只能在头部和尾部添加不能在中间添加(这是个环)。

裸KMP求最小循环节。

const int N=1e5+10;
char s[N];
int ne[N];
int n;

void init()
{
    for(int i=2,j=0;i<=n;i++)
    {
        while(j && s[i] != s[j+1]) j=ne[j];
        if(s[i] == s[j+1]) j++;
        ne[i]=j;
    }
}

int main()
{
    ios;
    int T;
    cin>>T;
    while(T--)
    {
        cin>>s+1;
        n=strlen(s+1);

        init();

        int cir=n-ne[n];
        if(cir != n && n % cir == 0) cout<<0<<endl; //要求至少存在两个循环节。
        else cout<<cir-n%cir<<endl;
    }
    //system("pause");
}
posted @ 2020-12-14 13:22  Dazzling!  阅读(40)  评论(0编辑  收藏  举报