题目链接:点击打开链接
题意描述:给定一个字符串,求使这个字符串是循环字符串至少需要添加多少个字符?要求循环至少两次
解题思路:kmp(next[]数组性质:点击打开链接)
根据next[]数组的性质我们可以得到一个字符串最小循环节为n-next[n],所以我们可以得出结论
if((n%(n-next[n])==0)&&(n/(n-next[n])>1)) printf("0\n"); else printf("%d\n",n-next[n]-n%(n-next[n]));
代码:
#include <cstdio> #include <cstring> #define MAXN 100010 using namespace std; void getNext(char* str,int len,int* next){ int i,j; j=next[0]=-1; i=0; while(i<len){ while(j!=-1&&str[i]!=str[j]) j=next[j]; ++i,++j; next[i]=j; } } char st[MAXN]; int next[MAXN]; int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%s",st); n=strlen(st); getNext(st,n,next); if((n%(n-next[n])==0)&&(n/(n-next[n])>1)) printf("0\n"); else printf("%d\n",n-next[n]-n%(n-next[n])); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-11 12:17:38