#include <bits/stdc++.h>
using namespace std;
const int base=131;
unsigned long long Pow(unsigned long long a,unsigned long long b)
{
//自然溢出的快速幂
unsigned long long res=1;
while(b)
{
if(b&1)res=res*a;
a=a*a;
b>>=1;
}
return res;
}
int RK(string s1,string s2)
{
int l1=s1.length(),l2=s2.length();//字符串长度
if(l1<l2)return -1;
//每次匹配最左边的权值一定是base^(l2-1),预处理成p
unsigned long long h1=0,h2=0,p=Pow(base,l2-1);
for(int i=0;i<l2;i++)
{
//计算自然溢出的hash
h1=h1*base+s1[i];
h2=h2*base+s2[i];
}
for(int i=0;i<l1-l2;i++)//枚举所有左端点
{
//如果hash相同,验算答案
if(h1==h2&&s1.substr(i,l2)==s2)return i;
//递推维护下一个匹配的hash
h1=(h1-s1[i]*p)*base+s1[i+l2];
}
return -1;
}
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
cout<<RK(s1,s2)<<'\n';
}
return 0;
}
用 KMP 过了,用 RK 算法 WA #50.