您的位置:首页 > 其它

KMP 模板

2016-05-07 13:25 239 查看
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <bitset>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stdlib.h>

using namespace std;
typedef long long LL;
const int INF=2e9+1e8;
const int MOD=1e9+7;
const int MAX_SIZE=1005;

void set_kmp_next(int *kmp_next,int len,string& b)
{
int i=0,j=-1;
kmp_next[0]=-1;
while(i<len)
{
if(j==-1||b[i]==b[j])
{
i++;
j++;
kmp_next[i]=j;
}
else
j=kmp_next[j];
}
}
int kmp(string &a,string& b)  // a 为原串  ,b 为模式串
{
int i,j,lena=a.size(),lenb=b.size();
int kmp_next[MAX_SIZE];
set_kmp_next(kmp_next,lenb,b);
i=j=0;
while(i<lena)
{
if(j==-1||a[i]==b[j])
{
i++;
j++;
}
else
j=kmp_next[j];
if(j==lenb)
return i-j+1;
}
return -1;
}
int main()
{
string a,b;
while(cin>>a>>b)
{
cout<<kmp(a,b)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: