[KMP求最小循环节][HDU3746][Cyclic Nacklace]

来源:互联网 发布:玻尔兹曼常数测量 知乎 编辑:程序博客网 时间:2024/06/06 03:22

题意

给你个字符串,问在字符串末尾还要添加几个字符,使得字符串循环2次以上。

解法

无论这个串是不是循环串
i-next[i] 都能求出它的最小循环节

代码:

/*思路:kmp+字符串的最小循环节问题分析:1 题目要求的是给定一个字符串,问我们还需要添加几个字符可以构成一个由n个循环节组成的字符串。2 可知我们应该先求出字符串的最小循环节的长度:假设字符串的长度为len,那么最小的循环节就是cir = len-next[len] ;如果有len%cir == 0,那么这个字符串就是已经是完美的字符串,不用添加任何字符;如果不是完美的那么需要添加的字符数就是cir - (len-(len/cir)*cir)),相当与需要在最后一个循环节上面添加几个。3 如果cir = 1,说明字符串只有一种字符例如“aaa” ; 如果cir = m说明最小的循环节长度为m,那么至少还需m个; 如果m%cir == 0,说明已经不用添加了。*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;char str[100005];int next[100005];void getnext(int len){    int i = 0,j = -1;    next[0] = -1;    while(i<len)    {        if(j == -1 || str[i] == str[j])        {            i++;            j++;            next[i] = j;        }        else            j = next[j];    }}int main(){    int n;    cin >> n;    getchar();    while(n--)    {        gets(str);        memset(next,0,sizeof(next));        int len = strlen(str);        int ans;        getnext(len);        ans = len - next[len];        if(ans!=len && len%ans == 0)        cout << 0 << endl;        else        cout << ans-next[len]%ans << endl;    }    return 0;}
0 0
原创粉丝点击