#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
char s1[101],s2[21];
int next[105],cont;
void getnext(char s[])
{
int j=-1,i=0,len;
next[0]=-1;
len=strlen(s);
while(i<len)
{
if(j==-1||s[i]==s[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
int KMP(char s1[],char s2[])//KMP再用..
{
int i=0,j=0,len,len1;
len=strlen(s1);
len1=strlen(s2);
while(i<len &&j<len1)
{
if(j==-1||s1[i]==s2[j])
{
++i;
++j;
}
else
j=next[j];
}
if(j>=len1) //找到子串不返回,再次查找.
{
cont++;
j=-1;
if(i>len)
{
cont=cont;
}
else
KMP(s1+i,s2);
}
return cont;
}
int main()
{
int n,m;
cin>>n;
while(n--)
{
cont=0;
cin>>s1>>s2;
getnext(s2);
m=KMP(s1,s2);
cout<<m<<endl;
}
return 0;
}
SDUTOJ 1449 子串
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.