hdu 1686 Oulipo

还是不怎么理解KMP

#include<iostream>
#include<string>
#define maxn 10010
using namespace std;
string s1,s2;
int nextt[maxn];
void kmp()
{
	nextt[0]=-1;
	int l=0;
	int k=-1;
	while(l<s1.size())
	{
		if(k==-1||s1[l]==s1[k]) nextt[++l]=++k;
		else k=nextt[k];
	}
}
int solve()
{
	int sum=0;
	int i=0,j=0;
	while(j<s2.size())
	{
		if(i==-1||s1[i]==s2[j])
		{
			i++;j++;
		}
		else
		{
			i=nextt[i];
		}
		if(i==s1.size())
		{
			//cout<<i<<"!"<<j<<endl;
			i=nextt[i];
			//cout<<i<<"~"<<j<<endl; 
			sum++;
		}
	}
	return sum;
}
int main()
{
	cin.sync_with_stdio(false);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>s1>>s2;
		if(s1.size()>s2.size())//不加会WA? 
		{
			cout<<"0"<<endl;
			continue;
		}
		kmp();
		cout<<solve()<<endl;
	}
	return 0;
} 


posted on 2017-07-20 21:09  wgwyanfs  阅读(83)  评论(0编辑  收藏  举报

导航