[AGC036E] ABC String
又是一个逐步简化的模型,好烦了又不会做这种题了呜啊呜啊。
首先相邻且相同的字符,我们可以缩在一起。
不妨假设
按照
注意到中间字符串长度大于等于
证明:若一直删除
那么我们现在的目标就是保证
如果还是不行的话,那么单个
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
char s[N];
int n,m,pos[3];
pair<int,int> mp[3];
int a[N],b[N];
void copy(){for(int i=1;i<=n;i++)b[i]=a[i];m=0;}
void output(){for(int i=1;i<=n;i++)printf("%d",a[i]);puts("");}
void makeeq(){
int x=0,y=0,z=0;
for(int i=1;i<=n;i++)
if(a[i]==0)++x;
else if(a[i]==1)++y;
else ++z;
copy();
for(int l=1,r=1;l<=n;l=++r)
if(b[l]!=0){
while(r<n&&b[r+1]!=0)++r;
if(r-l+1>=2){
if(b[l]==2){
if(z>y)--z;
else a[++m]=b[l];
}else a[++m]=b[l];
for(int i=l+1;i<r;i++)a[++m]=b[i];
if(b[r]==2){
if(z>y)--z;
else a[++m]=b[r];
}else a[++m]=b[r];
}
else if(z>y&&b[l]==2&&(l==1||r==n))--z;
else a[++m]=b[l];
}else a[++m]=b[l];
n=m;
if(z==y)return;
copy();
for(int i=1;i<=n;i++){
if(z>y&&i<=n-1&&(b[i]==0&&b[i+1]==2||b[i]==2&&b[i+1]==0))++i,--z;
else a[++m]=b[i];
}
n=m;
}
void getup(){
int x=0,y=0,z=0;
for(int i=1;i<=n;i++)
if(a[i]==0)++x;
else if(a[i]==1)++y;
else ++z;
copy();
for(int l=1,r=1;l<=n;l=++r)
if(b[l]!=0){
while(r<n&&b[r+1]!=0)++r;
while(r-l+1>2&&y>x)l+=2,--y;
if(y>x&&r-l+1==2&&(l==1||r==n))l+=2,--y;
for(int i=l;i<=r;i++)a[++m]=b[i];
}
else a[++m]=b[l];
n=m;
}
int main(){
for(int i=0;i<3;i++)mp[i].second=i;
scanf("%s",s+1);n=strlen(s+1);
for(int i=1;i<=n;i++)a[i]=s[i]-'A';
copy();
for(int i=1;i<=n;i++)if(i==1||b[i]!=b[i-1])a[++m]=b[i],++mp[b[i]].first;n=m;
sort(mp,mp+3);
for(int i=0;i<3;i++)pos[mp[i].second]=i;
for(int i=1;i<=n;i++)a[i]=pos[a[i]];
makeeq();
getup();
assert(n%3==0);
for(int i=1;i<=n;i++)printf("%c",mp[a[i]].second+'A');
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通