4.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

正解
while,如果s[i]=t[长度-1](也就是t的最后一位)
就往前判断s[i-t的长度+1]到s[i]这一段是否和t相等,相等就删除
最后输出s
AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s,t;
int ls,lt,i,o;
int main()
{
   
	freopen("censor.in","r",stdin);
	freopen("censor.out","w",stdout);
	cin>>s;
	cin>>t;
	ls=s.size();//记录长度
	lt=t.size();
 	while(i<=ls-1)
 	{
   
 		if(s[i]==t[lt-1]&&i>=lt-1)//s[i]和t的最后一位相等就进入
 		{
   	
 			o=i-lt+1;
 			for(int j=0;j<=lt-1;j++)//比较
 			 if(t[j]==s[o])o++;
 			  else{
   o=-1;break;}
 			if(o!=-1){
   s.erase(i-lt+1,lt);ls-=lt;i-=lt;}  //删除
		}
 		i++;	
	}
	cout<<s;
	return 0;
}

下面附本次比赛的其它题目

2020.03.04模拟赛12(第一题)
2020.03.04模拟赛12(第二题)
2020.03.04模拟赛12(第三题)
2020.03.04模拟赛12(第四题)
2020.03.04模拟赛12(第五题)
2020.03.04模拟赛12(总结)

谢谢观看