hdu 3746

//深入理解next数组(算法导论上的) 
//错误原因:等号写成了赋值号,自己还真犯这个错误了
// 这儿还是有点小疑问,ababa这样的串,求出的next为00123
//则5-next[5]=2,即串的长度为2,可本来前缀和后缀相等的串为aba长度为3,可见len-next[len]求的是不相互包含的串的长度
//即为求的ab,我们需要添加的即为(len-next[len])-len%(len-next[len])
#include<iostream>
using namespace std;

char s[100005];
int next[100005];

int T;
int get_prefix(int len){
    int k=0;
    int p;
    for(p=2;p<=len;p++){
        while(k>0&&s[k+1]!=s[p])
            k=next[k];
        if(s[k+1]==s[p])
            k=k+1;
        next[p]=k;
    }        
}

int main(){
    cin>>T;
    while(T--){
        scanf("%s",s+1);
        memset(next,0,sizeof(next));
        int len=strlen(s+1);
        get_prefix(len);
        if(len%(len-next[len])==0&&len!=len-next[len])
            cout<<"0"<<endl;
        else
            cout<<(len-next[len])-len%(len-next[len])<<endl;
    }
    system("pause");
    return 0;
}

你可能感兴趣的:(算法,System)