HDU3336 Count the string (KMP,next数组)

因为初次学习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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值