因为初次学习KMP,所以这题开始有点不好理解,看了许多的题解觉得有点复杂,因为这里是只求数量,所以感觉可以进行简化。思路如下:
先求出next数组,增加的操作是在计算next数组的过程中监视每一个next[i]值是否为零,不为零则说明存在与前缀相同的字串,这时直接进行数量加1。当next数组计算完成,答案也就出来了。
我也不确定这个思路会不会露了什么数据,如果有的话欢迎大家批评指正,感谢。
//HDU计算:给定字符串中前缀个数+与前缀相同字串的个数
#include<iostream>
#include<cstdio>
#pragma warning(disable:4996)
using namespace std;
const int NN = 200000 + 5;
char ss[NN];
int ne[NN];
int main() {
int sum, t, ssn;
scanf("%d", &t);
while (t--) {
scanf("%d", &ssn);
scanf("%s", ss);
sum = ssn;//前缀个数
ne[0] = -1;
int i = 0, j = -1;
while (i < ssn) {
if (j == -1 || ss[i] == ss[j]) {
i++;
j++;
ne[i] = j;
if (ne[i] != 0)//计算next数组,只要值不为0说明存在与前缀相同的字串,直接在答案上加一
sum++;
}
else
j = ne[j];
}
printf("%d\n", sum % 10007);
}
return 0;
}