題目描述
農民約翰已經爲他的奶牛訂好了Good Hooves keeping 雜誌,使他們有足夠的材料看。不幸的是,最新的一期載有關於如何煮完美的牛排的文章,而FJ 不想他的奶牛看到這篇相當不雅的文章(顯然,這本雜誌是需要更好的編輯監督的)。
FJ 從該雜誌採取了所有文字,創建了長度小於等於10^6 的字符串s。從此,他想刪除一個子串T來審查不當內容。要做到這一點,農民約翰找到S 中出現的T 並將其刪除。然後,他再次重複這個過程,刪除出現的T,一直持續到沒有出現T 的S。注意,刪除一次後可能會創建一個新的T出現,這個T是以前不存在的。
請輸出審查完畢後,FJ 所確定 的S的最終內容。
輸入
第一行將包含S
第二行包含T,T 的長度最多是S 的長度,S 和T 的所有字符均爲小寫字母(範圍a…z)
輸出
全部刪除完成後的S。保證使得S 在刪除過程中不會成爲空。
樣例輸入
whatthemomooofun
moo
樣例輸出
whatthefun
分析
先在這裏公然%一下cxy大佬%%
真的想不到棧模擬…聽了講解之後才做出來。
每次壓一個字符進去,再判斷後length(t)個字符是不是等於t(模式串) ,是就彈棧。
上代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
string s,t,s1;
int l,len;
int p;
char c[1000001];
int main(){
freopen("censor.in","r",stdin);
freopen("censor.out","w",stdout);
cin>>s;
cin>>t;
l=-1;
len=s.size();
for(int i=0;i<len;i++)
{
l++;
if((s[l]==t[t.size()-1])&&(l>=t.size()-1))
{
p=1;
for(int j=l-t.size()+1;j<=l;j++)
{
if(s[j]!=t[j-(l-t.size()+1)])
{
p=0;
break;
}
}
if(p!=0)
{
s.erase(l-t.size()+1,t.size());
l=l-t.size();
}
}
}
cout<<s;
fclose(stdin);
fclose(stdout);
return 0;
}