您的位置:首页 > 其它

GYM 101102 F.Exchange(水~)

2017-03-16 16:24 357 查看
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 111111
int 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: