GYM 101102 F.Exchange(水~)
来源:互联网 发布:pc端软件界面设计 编辑:程序博客网 时间:2024/05/29 16:57
Description
给出一个字符串,可以把这个字符串中两种字符X和Y互换,即所有X字符变成Y字符,所有Y字符变成X字符,求所有互换中字典序最小的串
Input
第一行一整数T表示用例组数,每组用例输入一个串长不超过1e5的全由小写字母组成的串
Output
输出经过互换后字典序最小的串
Sample Input
3
hamza
racecar
mca
Sample Output
ahmzh
arcecra
acm
Solution
以a[i]记录第i个字符是否可以用来交换,以b[i]记录第i个字符是否在之前已经出现过,对于第i个字符,如果b[i]=1说明之前已经出现过这个字符,之前就没换现在肯定也不会换,如果b[i]=0说明这个字符可能可以换,那么就找最小的j满足a[j]=1表示第i个字符能够用来交换,那么交换s[i]和j+’a’即可
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111111int T,n,a[33],b[33];char s[maxn];int main(){ scanf("%d",&T); while(T--) { scanf("%s",s); n=strlen(s); memset(a,-1,sizeof(a)); memset(b,0,sizeof(b)); for(int i=0;i<n;i++)a[s[i]-'a']=1; for(int i=0;i<n;i++) { if(b[s[i]-'a'])continue; int j=0; while(a[j]==-1)j++; if(j==26)break; if(s[i]==j+'a')a[j]=-1,b[j]=1; else { char x=s[i],y=j+'a'; for(int k=0;k<n;k++) if(s[k]==x)s[k]=y; else if(s[k]==y)s[k]=x; break; } } printf("%s\n",s); } return 0;}
0 0
- GYM 101102 F.Exchange(水~)
- Gym - 101102F F. Exchange 贪心、简单题
- codeforces Gym 101102F
- GYM 100488 F.Two Envelopes(水~)
- GYM 101149 F.The Weakest Sith(水~)
- [Gym-101350F] F
- Gym 100685F Flood(拓扑排序)
- Gym - 100512F Funny Game(杂题)
- Gym - 101142F Folding(折半)
- codeforces gym 101142 F(思维)
- GYM 100247 F. Battle Fury(二分)
- GYM 100090 F.Asperger Syndrome(set)
- GYM 101173 F.Free Figurines(贪心)
- GYM 100971 F.Two Points(三分)
- GYM 101086 F.Hey JUDgE(枚举)
- GYM 101061 F.Fairness(dp)
- Gym 101201F Illumination(2-sat)
- Gym 100685 F Flood
- Problem k-11 Box of Bricks
- AEAI DP开发统计分析
- 精通 Groovy
- MyEclipse找不到install new software,如何添加问题
- 何为HTTP、HTTPS、TCP/IP协议?
- GYM 101102 F.Exchange(水~)
- 微信公众号分享
- springMVC 实现ehcache 缓存 demo
- Linux中安装svn服务版
- Gradle
- RK3288如何开机GPIO为高或者为低
- [我眼中的C#]String和StringBuilder
- 使用Shiro入门
- MYSQL的常用命令和增删改查语句和数据类型