2020寒假【gmoj2194】【censor】【栈模拟】

题目描述

农民约翰已经为他的奶牛订好了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;
}

发布了110 篇原创文章 · 获赞 100 · 访问量 8029

猜你喜欢

转载自blog.csdn.net/dglyr/article/details/104826975
今日推荐