既然是kmp的模板题,肯定要用hash做啊!
需学习字符串哈希
注:爆int相当于对int的最大值取模
超短代码:
#include<bits/stdc++.h>
using namespace std;
string a,b;
int haa[1000006],hab,p[1000006],k=31,lena,lenb;
int main()
{
p[0]=1;
for(int i=1;i<=100000;i++)
p[i]=p[i-1]*k;
cin>>lenb; cin>>b; b=' '+b;
cin>>lena; cin>>a; a=' '+a;
for(int i=1;i<=lenb;i++) hab=hab*k+b[i]-'a';
for(int i=1;i<=lena;i++) haa[i]=haa[i-1]*k+a[i]-'a';
for(int i=1;i+lenb-1<=lena;i++)
if(haa[i+lenb-1]-haa[i-1]*p[lenb]==hab)
cout<<i-1<<" ";
return 0;
}
确实不戳,就是这代码风格有点费眼睛
开long long基本上大部分的哈希都不会爆把
大佬,问个问题。if(haa[i+lenb-1]-haa[i-1]*p[lenb]==hab)这一步为啥乘的是p[lenb]。它不是求b串i到i+lenb-1的哈希值吗,不是应该是i+lenb-1-(i-1)+1=lenb+1吗?
我合计你这也不ac啊
感谢提醒,代码当时(2019-12-15 20:59:10)是过了的,由于题目更新(数据变大了),只需要把数组开大即可,目前已修改(2020年8月20日11:40:11)