RT。 下面这个是代码,浅显易懂,1插入2查询。
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ri register int
const int mod=1145147777,base=197;
int in,cnt,num;
long long hs[10000001],bs[10000001];
string str,now;
il string chin()
{
string rn="";
char ch=getchar();
ch=getchar();
while(ch!='\n')
{
rn+=ch;
ch=getchar();
}
return rn;
}
il long long _hash(string x)
{
int y=x.size(),rn=0;
for(ri i=0;i<y;i++)
{
rn*=base;
rn+=x[i];
rn%=mod;
}
return rn;
}
int main()
{
// freopen("G_13.in","r",stdin);
// freopen("G_13.out","w",stdout);
// freopen("in.txt","r",stdin);
bs[0]=1;
while(scanf("%d",&in)!=EOF)
{
now=chin();
if(in==1)
{
str+=now;
for(ri i=cnt;i<str.size();i++)
{
hs[i+1]=hs[i]*base+now[i-cnt];
hs[i+1]%=mod;
}
cnt=str.size();
}
else
{
long long fd=_hash(now),ans=0;
while(num<now.size())
{
num++;
bs[num]=bs[num-1]*base%mod;
}
for(ri i=now.size();i<=cnt;i++)
{
long long ah=((hs[i]-(hs[i-now.size()]*bs[now.size()])%mod)+mod)%mod;
if(ah==fd)
{
ans++;
i+=now.size();
}
}
printf("%lld\n",ans);
}
}
cout<<str;
return 0;
}