hdu1686

只要解决一个问题这题就是裸题了:匹配成功后该怎么办?

匹配成功了,也就意味着当前这个文本串的位置被记录下来了,也就是说以后这个位置就是非法的了,也就是在答案+1后可以相当于这个位置失配,那不就好说了,模式串跳到next的位置

#include 
#include 
using namespace std;

char s1[10010], s[1000100];
int nxt[10010];

void get_next(int len){
	nxt[0] = -1;
	int j = 0;
	int k = -1;
	while(j < len){
		if(k == -1 || s1[k] == s1[j]){
			j ++;
			k ++;
			nxt[j] = k;
		}
		else
			k = nxt[k];
	}
	return ;
}
int main(){
	int T, i, j;
	scanf("%d", &T);
	while(T --){
		scanf("%s%s", s1, s);
		int len1 = strlen(s1);
		int len2 = strlen(s);
		get_next(len1);
		i = j = 0;
		int k = 0;
		while(i < len2){
			if(j == -1 || s[i] == s1[j]){
				i ++;
				j ++;
			}
			else
				j = nxt[j];
			if(j == len1){
				k ++;
				j = nxt[j];
			}
		}
		printf("%d\n", k);
	}
	return 0;
}

 

你可能感兴趣的:(hdu1686)