1455 Oulipo
给定两个字符串,求第一个字符串在第二个字符串中出现了几次,这不就是KMP?(为什么我总觉得是KMP,可能是我喜欢吃烤馍片吧)
其实hash还是挺简单的,就是一个模板的题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int SIZE=1e4+5;
char a[SIZE],b[SIZE];
int p[SIZE];
int hash[SIZE];
int base=27,mod=1<<31;
int s,ans;
int main()
{
p[0]=1;
for(int i=1;i<1e5+5;i++)
p[i]=p[i-1]*base;//p数组,为转换进制做准备
int t;
cin>>t;
while(t--)
{
scanf("%s %s",a+1,b+1);
int lena=strlen(a+1),lenb=strlen(b+1);
hash[0]=0;
for(int i=1;i<=lenb;i++) hash[i]=(hash[i-1]*base+b[i]-65+1)%mod;//转进制
s=0;ans=0;
for(int i=1;i<lena;i++) s=(s*base+(a[i]-'A'+1))%mod;
for(int i=0;i<=lenb-lena;i++)//枚举每一段进行比较
{
if(s==hash[i+lena]-hash[i]*p[lena]) ans++;//逐一进行比较
//比较难理解,其实就是计算i~lena+i的hash和a的进行比较
}
}
cout<<ans<<endl;
}