题意是给你一个字符串,看它是不是一个由子串循环组成的字符串,比如ababab就是由ab循环组成的,然后让求的是如果这个字符串不是一个循环的字符串就问需要加多少个字符才能变成一个循环的字符串,是的话就为0。
用kmp求出字符串前后缀重复数Next[],则尾部不能循环的部分长度为L=n-next[n-1],需要补充的长度为L - n%L
根据这道题,可以延伸去判断一个字符串是不是由子串循环构成的字符串,条件就是当L==n&&n%L==0的时候这个字符串就是一个由子串循环构成的字符串。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 1000005; int Next[MAXN]; char p[MAXN]; int n,T; void Com(){ Next[0] = 0; int k = 0; for(int q=1;q<n;q++){ while(k>0 && p[k]!=p[q])k = Next[k - 1]; if(p[k] == p[q])k++; Next[q] = k; } return ; } int main() { scanf("%d",&T); while(T--){ memset(Next,0,sizeof(Next)); scanf("%s",p); // n = strlen(t); n = strlen(p); Com(); int l = n - Next[n - 1]; if(l != n && n % l == 0){ printf("0\n"); } else printf("%d\n",l - n % l); // printf("%d\n",sum); } return 0; }