HDU3336 Count the string (KMP,next数组)

因为初次学习KMP,所以这题开始有点不好理解,看了许多的题解觉得有点复杂,因为这里是只求数量,所以感觉可以进行简化。思路如下:

先求出next数组,增加的操作是在计算next数组的过程中监视每一个next[i]值是否为零,不为零则说明存在与前缀相同的字串,这时直接进行数量加1。当next数组计算完成,答案也就出来了。

我也不确定这个思路会不会露了什么数据,如果有的话欢迎大家批评指正,感谢。

//HDU计算:给定字符串中前缀个数+与前缀相同字串的个数

#include
#include
#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;
}

你可能感兴趣的:(算法)