标签:
题意:要使这个串以一个间隔对称,最小要添加多少个字符(这里的对称是abcabc这样的,不是abccba这样的)
首先想到的是len-Next【len】,之后要对他处理,设d=len-Next【len】,之后len%d,如果==0,那就是abcabcabc这种情况,如果d==len,就是Next【】中全是0的情况。最后还要求d-Next[len]%d
#include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; typedef long long LL; #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 + 5 ; //kuangbin 模板 //Next[]调用的时候不需要初始化 int Next[MAXN]; void kmp_pre(char x[]) { int m=strlen(x); 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; } } char str[MAXN]; int main() { int o; SI(o); while(o--) { scanf("%s",str); kmp_pre(str); int len=strlen(str); int d=strlen(str)-Next[strlen(str)]; if (d!=len&&len%d==0) { puts("0"); } else { printf("%d\n",d-Next[len]%d); } } return 0; }
标签:
原文地址:http://www.cnblogs.com/s1124yy/p/5667487.html