字符串匹配:暴力和KMP
1.牛客———兔子的名字 链接标题
题目简介:有n个字符串T和m个字符串S,对于每一个T统计有多少个字符串S是其子序列。
思路:对于每一个T暴力匹配统计有多少个字符串S是其子序列。
#include<bits/stdc++.h>
using namespace std;
char t[1005][105],s[105][50];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",t[i]);
for(int i=0;i<m;i++)
scanf("%s",s[i]);
for(int i=0;i<n;i++)
{
int ans=0;
for(int j=0;j<m;j++)
{
int len1=strlen(t[i]),len2=strlen(s[j]),k=0,l=0;
while(k<len1&&l<len2)
{
if(t[i][k]==s[j][l])
{
k++;
l++;
}
else k++;
}
if(l>=len2) ans++;
}
printf("%d\n",ans);
}
} #include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int Nextval[N],n,m;
char s[N],t[N];
void getNext()
{
int j=0,k=-1;
Nextval[0]=-1;
while(j<m-1)
{
if(k==-1||t[k]==t[j])
{
k++;
j++;
if(t[k]!=t[j])
Nextval[j]=k;
else Nextval[j]=Nextval[k];
}
else k=Nextval[k];
}
}
int kmp()
{
int i=0,j=0,ans=0;
getNext();
while(i<n&&j<m)
{
if(j==-1||s[i]==t[j])
{
if(j+1==m)
{
j=Nextval[j];
ans++;
}
else i++,j++;
}
else j=Nextval[j];
}
return ans;
}
int main()
{
scanf("%s%s",s,t);
n=strlen(s),m=strlen(t);
int res=kmp();
if(res) printf("YES\n%d\n",res);
else printf("NO\n");
} 