[AGC055A] ABC Identity 题解
1.P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流2.Phi的反函数3.魔力屏障 (magic) 题解4.CF338D GCD Table 题解5.[AGC055B] ABC Supremacy 题解
6.[AGC055A] ABC Identity 题解
7.QOJ 6504. CCPC Final 2022 D Flower's Land 2题解8.[SDOI2010] 代码拍卖会 题解9.PERIODNI - Periodni 题解 & 笛卡尔树讲解 & 树状背包讲解10.Burnside 定理11.ZS Shuffles Cards 题解[AGC055A] ABC Identity 题解
题目描述
给定长度为
一个合法序列
-
其长度为
。 -
-
-
-
互不相同。
求一个把这个序列分成不多于 个合法的序列的方案。
可以证明,一定存在一种合法的划分。
解析
将序列分成等长的 3 段,用桶来记录每一段 A,B,C 个数,枚举 6 种排列
等长的 3 段中,第
取尽量多,也就是三个桶取min
。
可以证明枚举完以后序列所有字母会被选完。
第
排列只有 6 种,当然也只有 6 组。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 6e5 + 9;
int n,l,r,mid,ans[N];
char a[N],ck[7][4]={{'0','0','0'},
{'A','B','C'},{'A','C','B'},
{'B','A','C'},{'B','C','A'},
{'C','A','B'},{'C','B','A'}};
int t[4][4];
void input(){
cin>>n>>a + 1;
for(int i = 0; i <= 2; ++i){
for(int j = i * n + 1; j <= (i + 1) * n; ++j){
++t[i][a[j] - 'A'];
}
}
}
void cg(int num, int cd){
for(int i = 0; i <= 2; ++i){
int now = num;
for(int j = i * n + 1; j <= (i + 1) * n && now; ++j){
if(ck[cd][i] == a[j] && (!ans[j]))
ans[j] = cd, --now;
}
}
}
void op(){
for(int i = 1; i <= 6; ++i){
int num = min(t[0][ck[i][0] - 'A'], min(t[1][ck[i][1] - 'A'], t[2][ck[i][2] - 'A']));
cg(num, i);
t[0][ck[i][0] - 'A'] -= num;
t[1][ck[i][1] - 'A'] -= num;
t[2][ck[i][2] - 'A'] -= num;
}
}
int main(){
cin.tie(0)->sync_with_stdio(0);
input();
op();
for(int i = 1; i <= 3 * n; ++i)
cout<<ans[i];
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!