给出一个字符串,你可以通过在首尾加入字符使其变成一个具有周期T(T>=2)的字符串,求所需加入的最少字符数。
所考察算法仍然是对next数组含义的理解
#include<cstdio> #include<cstring> char S[100005]; int next[100005]; int len; void getNext() { int j=0,k=-1; next[0]=-1; while(j<len) if(k==-1||S[j]==S[k]) next[++j]=++k; else k=next[k]; } void printNext() { for(int i=0;i<len;i++) printf("%3c",S[i]); puts(""); for(int i=1;i<=len;i++) printf("%3d",next[i]); puts(""); } int main() { int T;scanf("%d",&T); while(T--) { scanf("%s",S); len=strlen(S); getNext(); // printNext(); int t=len-next[len]; //t即为最小周期 if(t==len) printf("%d ",len); else if(len%t==0) puts("0"); else printf("%d ",t-len%t); } }