原题链接:SCU4438——哈希+前缀和
学习博客:【哈希-字符串匹配+模拟栈】SCU - 4438: Censor(哈希详解哈哈哈)
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
const int N=1e6;
const ull base=10;
ull Hash[N],p[N];
void pre()
{
p[0]=1;
for(int i=1;i<=N;i++)
{
p[i]=p[i-1]*base;
}
}
int main()
{
std::ios::sync_with_stdio(false);
string s1,s2;
pre();
while(cin>>s1>>s2)
{
int len1=s1.length();
int len2=s2.length();
ull tmp=0;
string s3;
if(len2<len1)
{
cout<<s2<<endl;
continue;
}
else
{
for(int i=0;i<len1;i++)
{
tmp=tmp*base+s1[i]-'a'+1;
}
Hash[0]=0;
int top=0;
for(int i=0;i<len2;i++)
{
s3[top++]=s2[i];
Hash[top]=Hash[top-1]*base+s2[i]-'a'+1;
if(top>=len1 && Hash[top]-Hash[top-len1]*p[len1]==tmp)
{
top-=len1;//这里很巧
}
}
for(int i=0;i<top;i++)
{
cout<<s3[i];
}
cout<<endl;
}
}
return 0;
}