P1341 无序字母对
题面:https://www.luogu.org/problem/P1341
本题是一个欧拉回路模板题,直接建图跑欧拉回路即可,注意:有环时需回溯后再记录.
Code:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=10005;
int cnt[N][N],ans[N],cur,cnt0[N];
void dfs(int u){
for(int i=1;i<=52;i++){
if(cnt[u][i]){
cnt[u][i]--;
cnt[i][u]--;
cnt0[i]--;
cnt0[u]--;
dfs(i);
}
}
ans[++cur]=u;
}
int main(){
int n,kdl=0;
scanf("%d",&n);
scanf("\n");
for(int i=1;i<=n;i++){
char a,b;
int c,d;
scanf("%c%c\n\n",&a,&b);
if(a>='A'&&a<='Z')c=a-'A'+1;
else c=a-'a'+27;
if(b>='A'&&b<='Z')d=b-'A'+1;
else d=b-'a'+27;
cnt[c][d]++;cnt[d][c]++;
cnt0[c]++,cnt0[d]++;
}
int f=0;
for(int i=1;i<=52;i++){
if(cnt0[i]&1){
if(f==0){
f=i;
}
kdl++;
}
}
if(kdl!=2&&kdl){
puts("No Solution");
return 0;
}
if(kdl==0){
for(int i=1;i<=52;i++){
if(cnt0[i]){
f=i;
break;
}
}
}
dfs(f);
for(int i=1;i<=52;i++){
if(cnt0[i]){
puts("No Solution");
return 0;
}
}
for(int i=cur;i>=1;i--){
if(ans[i]>=1&&ans[i]<=26){
printf("%c",ans[i]+'A'-1);
}
else{
printf("%c",ans[i]+'a'-27);
}
}
puts("");
return 0;
}