问题如下;
rxx很皮,今天又找到了新玩儿法。rxx给你一个字符串,并问你在该字符串末尾最少补充多少个字符,可以使得这个字符串获得周期性。周期性指存在一个子串,使得该字符串可以正好分解成若干个这个子串,且周期数大于1。
Input
第一行是一个整数 T ( 0<T<=100 ) 代表测试数据的组数。
之后T行每行一个字符串,由小写字母组成,字符串的长度3<=L<=100000。
output
每组数据输出一行结果
Sample Input
3
ppp
pip
amazing
Sample output
0
1
7
【分析】;字符串要有周期性,就表明它至少有两个循环节;
以下代码是我的理解:
#include<string.h>
#include<cstdio>
using namespace std;
int next1[100000];
void getnext(char *s1) //计算目标串的next数组;
{
int len1 = strlen(s1);
int i = 0, j = -1;
next1[0] = -1;
while (i < len1)
{
if (j == -1 || s1[i] == s1[j])
{
i++;
j++;
next1[i] = j;
}
else
{
j = next1[j];
}
}
}
int main()
{
char s1[100000];
int t,sum;
scanf("%d", &t);
while (t--)
{
scanf("%s", s1);
getnext(s1);
int len1 = strlen(s1); //计算目标串长度;
int k = len1 - next1[len1];//计算循环节;
if (len1 == k) //如果字符串长度等于循环节长度,就表明此字符串没有周期性;
sum = len1; //所以,它需要添加的长度等于他本身的长度
else if (len1%k == 0) //如果它的长度是循环节长度的整数倍,就说明它本身有周期性,不需要再添加字符
sum = 0;
else
sum = k - (len1%k); //计算需要添加的长度。
printf("%d\n", sum);
}
return 0;
}
由此题可以总结一个很重要的结论: 用KMP算法得到目标串的next数组后,它的循环节数等于它的长度减去它的next数组的值;即
k=len-next[len]