【题解】[ARC113C] String Invasion

题面传送门

解决思路

题目大意是给你一个字符串 s ,定义一次操作为对于长度为 3 的一个子段,满足 si=si+1si+2,则可以将 si+2 变为 si 。问最多可以操作多少次。

首先可以对照样例三找出规律。对于样例三 anerroroccurred,最优的操作方法是:

  • 2 后变成 anerroroccurrrr(改 r

  • 5 次变成 anerroroccccccc(改 c

  • 9 次变成 anerrrrrrrrrrrr(改 r

可以发现,最优策略是从后往前找,每次找到可以操作的,就把它后面的所有字母都变成一样的。

假设字符串长度为 n,并且 si=si+1,则可以操作的次数是 n(i+2)(sumsi2),其中,n(i+2) 算出之后有几个字符。sumsi 表示:当前字符串当前操作位置及之后位置 有多少个字符为 si 。因为重复的字符不能操作,所以要减掉,又因为第 si,si+1 位不算,所以减 2

一次修改后,之后的字符都变相同了,所以将 sum 清空,同时赋 sumsini

AC Code

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define TIE cin.tie(0),cout.tie(0)
#define int long long
using namespace std;
string s;
int sum[200],ans;
signed main(){	
	IOS;TIE;
	cin>>s;
	sum[s[s.size()-1]]++;
	sum[s[s.size()-2]]++;
	for(int i=s.size()-3;i>=0;i--){
		sum[s[i]]++;
		if(s[i]==s[i+1]&&s[i+1]!=s[i+2]){
			ans+=s.size()-i-sum[s[i]];
			for(int j='a';j<='z';j++) sum[j]=0;
			sum[s[i]]=s.size()-i;
		}
	}
	cout<<ans<<endl;
	return 0;
}
posted @   Binary_Lee  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
Title
点击右上角即可分享
微信分享提示