看好半天才明白题意。题目大意是说给定一个串,需要在两端加上一些字符,求最少加上多少字符可以使得这个串成为周期循环串。由于要构成环,所以在两端加字符和在一端加其实没什么区别,于是我们只考虑在右端加字符。其实这就是KMP算法中的Next表的应用,所以需要很好的理解Next表格的含义。
先来回顾下Next[j]的含义。设模式串为P[0...m-1],则Next[j]表示P的前缀串P[0...j-1]的前缀与后缀匹配的最大长度。也可以理解为p的长度为 j 的前缀子串的前缀与后缀匹配的最大长度。设 t =Next[j],于是有P[0..t-1]==P[j-t...t-1]。我们算出这个条件是构成周期串的重要信息。结果会发现如果长度为 j 的字串要构成周期串,那么周期最小长度为 j-t 。在考虑整个字串时。我们要算出Next[m] .则构成循环串的最小周期为 T=m - Next[m]. 需要补加最少字符数位 (T-m%T)%T个,当然Next[m]==0时情况要单独考虑。
#include<iostream>
using namespace std;
int Next[100003];
char p[100002];
int main(){
int i, j, T, m, ans;
scanf("%d",&T);
Next[0] = -1;
while (T--){
scanf("%s",p);
m =strlen(p);
for (i = 1; i <= m; i++){
j = Next[i - 1];
while (j != -1 && p[i - 1] != p[j])
j = Next[j];
Next[i] = j + 1;
}
j = m - Next[m];
if (j == m) //题目要求至少2个周期,j==m表示Next[m]==0
ans = m;
else
ans = (j - m%j) % j;
printf("%d\n", ans);
}
return 0;
}