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
原创粉丝点击