您的位置:首页 > 其它

Codeforces Round #288 (Div. 2) D Tanya and Password

2015-03-23 11:20 281 查看
裸欧拉路,至于对欧拉路不了解的同学可以看本博客里对欧拉路的解释。

对于abc这个字符串,把ab、bc分别看成一个点连接一条边,然后直接欧拉路即可。

下面是AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
vector<int >g[10005];
int vis[100005];
int in[10005],out[10005],use[10005];
char c[6];
int a[200005],cnt;
int change(char c){
if(c>='a'&&c<='z') return c-'a';
if(c>='A'&&c<='Z') return 26+c-'A';
return 52+c-'0';
}
void add(int a,int b){
g[a].push_back(b);
}
int e,flag;
int it[10005];
void dfs(int u,int ee){
int p;
p=(int)g[u].size();
while(it[u]<p){
int m=it[u];
it[u]++;
use[g[u][m]]=1;
dfs(g[u][m],0);
}
a[cnt++]=u;
}
int c2(int x){
if(x>=0&&x<=25) return x+'a';
if(x>=26&&x<=51){
return x-26+'A';
}
return x-52+'0';
}
int c1(int p){
int x;
x=p/100;
return c2(x);
}
int main()
{
int i,n,m;
int aa,b,p;
cin>>n;
for(i=0;i<n;i++){
scanf("%s",c);
aa=change(c[0]);
b=change(c[1]);
p=change(c[2]);
add(aa*100+b,b*100+p);
in[b*100+p]++;
out[aa*100+b]++;
e+=2;
}
int x=0,y=0;
m=0;
for(i=0;i<=10000;i++){
if(in[i]!=out[i]){
if(in[i]==out[i]+1){
x++;
}
else if(out[i]==in[i]+1){
y++;
}
else{
m=1;
}
}
}
if(!((x==0&&y==0)||(x==1&&y==1))) m=1;
if(m) printf("NO\n");
else{
if(x==0){
for(i=0;i<=10000;i++){
if(in[i]!=0){
use[i]=1;
dfs(i,0);
break;
}
}
}
else{
for(i=0;i<=10000;i++){
if(out[i]==in[i]+1){
use[i]=1;
dfs(i,0);
break;
}
}
}
for(i=0;i<=10000;i++){
if(!(in[i]==0&&out[i]==0)){
if(!use[i]){
m=1;
break;
}
}
}
if(m) printf("NO\n");
else{
printf("YES\n");
printf("%c",c2(a[cnt-1]/100));
for(i=cnt-1;i>=0;i--){
printf("%c",c2(a[i]%100));
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: