题意:要使这个串以一个间隔对称,最少要添加多少个字符(这里的对称是abcabc这样的,不是abccba这样的)
首先想到的是n-Next[n](这是可以循环的串的长度),之后总长对循环串长度取余,就是多出的长度,在用循环串长度 - 多出的长度 就是答案了
#include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; typedef long long ll; #define PU puts("") #define PI(A) printf("%d\n",A) #define SI(N) scanf("%d",&(N)) #define SII(N,M) scanf("%d%d",&(N),&(M)) #define cle(a,val) memset(a,(val),sizeof(a)) #define rep(i,b) for(int i=0;i<(b);i++) #define Rep(i,a,b) for(int i=(a);i<=(b);i++) #define reRep(i,a,b) for(int i=(a);i>=(b);i--) const double EPS= 1e-9 ; /* / C o d i n g S p a c e / */ const int MAXN= 100000+9 ; void kmp_pre(char x[],int m,int Next[]) { int i,j; j=Next[0]=-1; i=0; while(i<m) { while(-1!=j&&x[i]!=x[j])j=Next[j]; Next[++i]=++j; } } int Next[MAXN]; char str[MAXN]; int main() { int o; SI(o); while(o--) { scanf("%s",str); int n=strlen(str); kmp_pre(str,n,Next); if (Next[n]==0) { printf("%d\n",n); } else if (n%(n-Next[n])==0) { printf("0\n"); } else { //n-Next[n]是循环串的长度 n%(n-Next[n])是多出来的长度 //循环串长度 - 多出的长度 = 需要的长度 // n-Next[n] - n%(n-Next[n]) = ans PI(n-Next[n]-n%(n-Next[n])); } } return 0; }