题解:CF1941C(C. Rudolf and the Ugly String)

文章描述了解决一个编程问题的方法,给定一个字符串,最少需要删除多少字符以消除map和pie的子串。通过枚举子串并计数,减去重复计数得到最优答案。给出的C++代码实现了这个算法。
摘要由CSDN通过智能技术生成

题解:CF1941C(C. Rudolf and the Ugly String)

题目翻译:给定一个字符串,请你求出最少需要删除几个字符才能使得该字符串内不存在 mappie

我们可以先在该字符串内找到所有的子串 mapie,并删除中间的 p,这样可以用删除 1 1 1 个字符的代价干掉一个 map 一个 pie(共个)。显然这样的字符串不会重叠出现

之后,剩下的所有 mappie不存在重叠。这时,我们可以找到所有的子串 map 和 子串 pie,并删去中间的 ai,这样我们可以用删除 1 1 1 个字符的代价干掉一个 map 一个 pie(共个)。

显然,这样选是最优的。

我们该如何实现呢?我们不能真的用字符串去模拟删除操作,但是我们可以通过枚举形如 mapiemappie 的子串的数量得出。具体的,记 mappie 的总数量为 a n s ans ansmapie 的数量为 a n s 2 ans2 ans2正常情况下答案应该为 a n s + a n s 2 ans+ans2 ans+ans2,但由于每出现一个 mapie 就会对应的出现一组 mappie,而我们并没有进行去重,所以每个 mapie 在计算 a n s 2 ans2 ans2 之前就已经被统计了两次,所以应该减去一次,即最终的答案应该是 a n s − a n s 2 ans-ans2 ansans2

代码:

#include<bits/stdc++.h>
using namespace std;
int t;
string x;
int main(){
	scanf("%d",&t);
	while(t--){
		cin>>x>>x;
		int l=x.size(),ans=0,ans2=0;
		for(int i=1;i<l-1;i++){
			if(x[i-1]=='m'&&x[i]=='a'&&x[i+1]=='p'){
				ans++;
			}
			if(x[i-1]=='p'&&x[i]=='i'&&x[i+1]=='e'){
				ans++;
			}
			if(i!=1&&i!=l-2){
				if(x[i-2]=='m'&&x[i-1]=='a'&&x[i]=='p'&&x[i+1]=='i'&&x[i+2]=='e'){
					ans2++;
				}
			}
		}
		printf("%d\n",ans-ans2);
	}
	return 0;
}
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值