zoukankan      html  css  js  c++  java
  • codeforces 508D . Tanya and Password 欧拉通路

    题目链接

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

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

     1 #include <iostream>
     2 #include <vector>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 #include <cmath>
     7 #include <map>
     8 #include <set>
     9 #include <stack>
    10 #include <string>
    11 #include <queue>
    12 using namespace std;
    13 #define pb(x) push_back(x)
    14 #define ll long long
    15 #define mk(x, y) make_pair(x, y)
    16 #define lson l, m, rt<<1
    17 #define mem(a) memset(a, 0, sizeof(a))
    18 #define rson m+1, r, rt<<1|1
    19 #define mem1(a) memset(a, -1, sizeof(a))
    20 #define mem2(a) memset(a, 0x3f, sizeof(a))
    21 #define rep(i, n, a) for(int i = a; i<n; i++)
    22 #define fi first
    23 #define se second
    24 typedef pair<int, int> pll;
    25 const double PI = acos(-1.0);
    26 const double eps = 1e-8;
    27 const int mod = 1e9+7;
    28 const int inf = 1061109567;
    29 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    30 map <string, int> ma;
    31 string a[400005];
    32 int cnt, inde[400005], outde[400005], vis[400005*2], num, ans[2*400005], ecnt[66000];
    33 vector <int> v[66000];
    34 void dfs(int u) {
    35     while(ecnt[u]<v[u].size()) {
    36         dfs(v[u][ecnt[u]++]);
    37     }
    38     ans[num++] = u%256;
    39 }
    40 int main()
    41 {
    42     ios::sync_with_stdio(0);
    43     string s, tmp;
    44     int n, pos1, pos2;
    45     cin>>n;
    46     int cnt = 1, start;
    47     for(int i = 0; i<n; i++) {
    48         cin>>s;
    49         int u = 256*s[0]+s[1];
    50         int to = 256*s[1]+s[2];
    51         v[u].pb(to);
    52         inde[to]++;
    53         outde[u]++;
    54         start = u;
    55     }
    56     pos1 = -1, pos2 = -1;
    57     int flag = 0;
    58     for(int i = 1; i<66000; i++) {
    59         if(outde[i]!=inde[i]) {
    60             if(outde[i]==inde[i]+1) {
    61                 if(pos1==-1) {
    62                     pos1 = i;
    63                 }  else {
    64                     flag = 1;
    65                 }
    66             } else {
    67                 if(pos2==-1)
    68                     pos2=i;
    69                 else
    70                     flag = 1;
    71             }
    72         }
    73     }
    74     if(flag||(pos1==-1&&pos2!=-1||pos2==-1&&pos1!=-1)) {
    75         cout<<"NO"<<endl;
    76         return 0;
    77     }
    78     num = 0;
    79     if(pos1 == -1)
    80         pos1 = start;
    81     dfs(pos1);
    82     if(num != n+1) {
    83         puts("NO");
    84         return 0;
    85     }
    86     s = "", tmp = "";
    87     tmp = (char)(pos1/256);
    88     for(int i = num-1; i>=0; i--) {
    89         tmp += char(ans[i]);
    90     }
    91     cout<<"YES"<<endl;
    92     cout<<tmp;
    93     return 0;
    94 }
  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/yohaha/p/5077985.html
Copyright © 2011-2022 走看看