博客园 首页 私信博主 显示目录 隐藏目录 管理

【字符串】

考前挣扎,奶一口,绝对不会考字符串(因为我不会)
KMP算法:

求出模式串在主串中出现的所有位置及nxt数组
之后可能加上一个计算出现次数的函数

#include<bits/stdc++.h>

using namespace std;

const int N = 1000010;

int slen, tlen;
int nxt[N];
char S[N], T[N];

void getnxt(){
	int j = 0, k = -1;
	nxt[0] = -1;
	while(j < tlen){
		if(k == -1 || T[j] == T[k]) nxt[++j] = ++k;
		else k = nxt[k];
	}
}

void KMP(){
	int i = 0, j = 0;
	getnxt();
	while(i < slen && j < tlen){
		if(j == -1 || S[i] == T[j]) ++i, ++j;
		else j = nxt[j];
		if(j == tlen) printf("%d\n", i-tlen+1), j = nxt[j];
	}
}

int main(){
	freopen("kmp.in", "r", stdin);
	freopen("kmp.out","w",stdout);
	
	scanf("%s", S); scanf("%s", T);
	slen = strlen(S);
	tlen = strlen(T);

	KMP();
	for(int i = 1; i <= tlen; ++i) printf("%d ", nxt[i]);
	puts("");
	return 0;
}
posted @ 2017-11-10 16:49  Hanser  阅读(135)  评论(0编辑  收藏  举报