您的位置:首页 > 其它

kmp

2014-05-19 19:55 218 查看
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

#define M 1000

void getFail(char * P, int * f)
{
	int m = strlen( P );
	f[0] = f[1] = 0;
	for(int i = 1; i < m; i++ )
	{
		int j = f[i];
		while( j && P[i] != P[j] ) j = f[j];
		f[ i + 1 ] = P[ i ] == P[ j ] ? j + 1 : 0;
	}
}

void find(char * T, char * P, int *f)
{
	int n = strlen( T ), m = strlen( P );
	getFail(P, f);
	int j = 0;
	for(int i = 0; i < n; i++ )
	{
		while(j && P[ j ] != T[ i ] ) j = f[ j ];
		if( P[ j ] == T[ i ] ) j++;
		if( j == m ) printf("%d\n", i - m + 1);
	}
}

int main()
{
	char t[M], p[M];
	int f[M];
	scanf("%s%s",t, p);
	find(t, p, f);
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: