Description
求最少需要在给定字符串后面补几个字符才能凑成至少两个循环
Solution
对KMP中p数组的灵活引用
首先,n-p[n]为为字符串的最小循环节,如果(n%(n-p[n]))==0那么不需要补字符
否则的话,应补的字符数最少应为(n-p[n])-n%(n-p[n])
Code
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,T,p[100010]; char s[100010]; int main(){ scanf("%d",&T); while(T--){ memset(p,0,sizeof(p)); scanf("%s",s+1); n=strlen(s+1); for(int i=2,j=0;i<=n;++i){ while(j>0&&s[i]!=s[j+1]) j=p[j]; if(s[i]==s[j+1]) j++; p[i]=j; } int x=n-p[n]; if(x==n) printf("%d ",n); else if(n%x==0) puts("0"); else printf("%d ",x-n%x); } return 0; }