• POJ2513Colored Sticks(欧拉路加字典树)


    传送门

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <algorithm>
      4 using namespace std;
      5 const int maxn = 5e5 + 10;
      6 const int maxsize = 27;
      7 
      8 int par[maxn];
      9 int rnk[maxn];
     10 char s1[20], s2[20];
     11 int vis[maxn];
     12 int ch[maxn][maxsize];
     13 int val[maxn];
     14 
     15 int t;
     16 
     17 void init() {
     18     for (int i = 0; i < maxn; i++) {
     19         par[i] = i;
     20         rnk[i] = 0;
     21     }
     22 }
     23 
     24 int find(int x) {
     25     if (par[x] == x) return x;
     26     else return par[x] = find(par[x]);
     27 }
     28 
     29 void unite(int x, int y) {
     30     x = find(x);
     31     y = find(y);
     32     if (x == y) return;
     33 
     34     if (rnk[x] < rnk[y]) {
     35         par[x] = y;
     36     } else {
     37         par[y] = x;
     38         if (rnk[x] == rnk[y]) rnk[x]++;
     39     }
     40 }
     41 
     42 bool same(int x, int y) {
     43     return find(x) == find(y);
     44 }
     45 
     46 struct Tire {
     47     int sz;
     48     Tire() {
     49         sz = 1;
     50         memset(ch[0], 0, sizeof(ch[0]));
     51     }
     52     int idx(char c) {return c - 'a';}
     53 
     54     int FFF(char* s) {
     55         int len = strlen(s);
     56         int u = 0;
     57         for (int i = 0; i < len; i++) {
     58             int c = idx(s[i]);
     59             if (!ch[u][c]) {
     60                 memset(ch[sz], 0, sizeof(ch[sz]));
     61                 val[sz] = 0;
     62                 ch[u][c] = sz++;
     63             }
     64             u = ch[u][c];
     65         }
     66         if (!val[u]) val[u] = t++;
     67         return val[u];
     68     }
     69 
     70 };
     71 
     72 
     73 
     74 int main() {
     75     init();
     76     int tag = 0;
     77     Tire Tree;
     78     t = 1;
     79     while (~scanf("%s%s", s1, s2)) {
     80         int a = Tree.FFF(s1), b = Tree.FFF(s2);
     81         vis[a]++; vis[b]++;
     82         if (!same(a, b)) {
     83             unite(a, b);
     84         }
     85         tag++;
     86         //if (tag == 5) break;
     87     }
     88     int odd = 0;
     89     bool flag = 1;
     90     for (int i = 1; i < t && flag; i++) {
     91         if (vis[i] & 1) odd++;
     92         if (find(i) != find(1)) flag = 0;
     93     }
     94     if (odd != 0 && odd != 2) {
     95         flag = 0;
     96     }
     97     if (flag) {
     98         puts("Possible");
     99     } else {
    100         puts("Impossible");
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    pip 8 安装
    zabbix server配置文件
    双代号网络图、双代号时标网络图
    logrotate
    tsql 执行存储过程
    dos 加用户
    Visual Studio (VS IDE) 你必须知道的功能和技巧
    格式化数字字符串 与C#变量
    .NET中的字符串你了解多少?
    新手如何有效地学习.NET
  • 原文地址:https://www.cnblogs.com/xFANx/p/8516458.html
Copyright © 2020-2023  润新知