传送门:Problem - 1735C - Codeforces
该题是将字符串按最小字典序的顺序连城一个环,有点绕,有点像链表。注意的是在环判断中只用循环24此就改跳出循环了,不然会找到重复的环。
代码如下:
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<string.h>
#include<queue>
#include<unordered_map>
using namespace std;
typedef long long ll;
char s[200005];
map<char,char>hh;
bool dui(char a,char b){
int an=0;
while(hh[a]){
if(hh[a]==b)return 1;
an++;
a=hh[a];
if(an>=24)return 0;
}
return 0;
}
int main() {
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
int t;
cin >> t;
while (t--){
hh.clear();
map<char,int>c;
// hh.clear();
int n;
cin>>n;
cin>>s;
// for(int i=0;i<n;i++){
//
// }
for(int i=0;i<n;i++){
if(hh[s[i]]<='z'&&hh[s[i]]>='a')continue;
for(char j='a';j<='z';j++){
if(c[j]==1||j==s[i])continue;
if(dui(j,s[i]))continue;
c[j]=1;
hh[s[i]]=j;
break;
}
}
for(int i=0;i<n;i++){
cout<<hh[s[i]];
}
cout<<"\n";
}
}