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;
}
该博客讨论了一种字符串匹配问题的解决方案,通过使用KMP算法和哈希技巧来计算一个字符串在另一个字符串中出现的次数。作者提供了一个C++代码示例,展示了如何利用哈希函数和滚动哈希进行快速比较。博客内容涵盖了字符串处理和算法应用的基础知识。
261

被折叠的 条评论
为什么被折叠?



