题意:给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0
abcac 没有循环2次,添加字符abcac。数目为5.
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1.
分析:就是一个简单的KMP循环节问题,但我只能说杭电的数据太水了,一开始我写的一个明显有BUG的代码也能够AC,算了不说了!!
代码实现:
#include<iostream> #include<cstring> using namespace std; char a[100001]; int next[100001]; int main() { int T,len,i,j,nima; while(scanf("%d",&T)!=EOF) { getchar(); while(T--) { scanf("%s",a+1); len=strlen(a+1); i=1;j=0;next[1]=0; while(i<=len) { if(j==0||a[i]==a[j]) { i++;j++; next[i]=j; } else j=next[j]; } nima=(len+1)-next[len+1]; if(len%nima==0&&len!=nima//这里要注意个是循环节的长度不能等于它自己本身就是len!=nima printf("%d\n",0); else printf("%d\n",nima-len%nima); } } return 0; }