您的位置:首页 > 其它

codeforces 508D . Tanya and Password 欧拉通路

2015-12-26 13:41 183 查看
题目链接

给你n个长度为3的子串, 这些子串是由一个长度为n+2的串分割得来的, 求原串, 如果给出的不合法, 输出-1。

一个欧拉通路的题, 将子串的前两个字符和后两个字符看成一个点, 比如acb, 就是ac->cb。 然后建图。

#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <stack>
#include <string>
#include <queue>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
map <string, int> ma;
string a[400005];
int cnt, inde[400005], outde[400005], vis[400005*2], num, ans[2*400005], ecnt[66000];
vector <int> v[66000];
void dfs(int u) {
while(ecnt[u]<v[u].size()) {
dfs(v[u][ecnt[u]++]);
}
ans[num++] = u%256;
}
int main()
{
ios::sync_with_stdio(0);
string s, tmp;
int n, pos1, pos2;
cin>>n;
int cnt = 1, start;
for(int i = 0; i<n; i++) {
cin>>s;
int u = 256*s[0]+s[1];
int to = 256*s[1]+s[2];
v[u].pb(to);
inde[to]++;
outde[u]++;
start = u;
}
pos1 = -1, pos2 = -1;
int flag = 0;
for(int i = 1; i<66000; i++) {
if(outde[i]!=inde[i]) {
if(outde[i]==inde[i]+1) {
if(pos1==-1) {
pos1 = i;
}  else {
flag = 1;
}
} else {
if(pos2==-1)
pos2=i;
else
flag = 1;
}
}
}
if(flag||(pos1==-1&&pos2!=-1||pos2==-1&&pos1!=-1)) {
cout<<"NO"<<endl;
return 0;
}
num = 0;
if(pos1 == -1)
pos1 = start;
dfs(pos1);
if(num != n+1) {
puts("NO");
return 0;
}
s = "", tmp = "";
tmp = (char)(pos1/256);
for(int i = num-1; i>=0; i--) {
tmp += char(ans[i]);
}
cout<<"YES"<<endl;
cout<<tmp;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: