【CF】556D A Lot of Games

构建trie树,可以得到4类结点:必胜点,必负点,完全主宰点(可胜可负),完全无法主宰点(无法控制最终胜负)。递归到叶子结点,即为必胜点,回溯分情况讨论。注意叶子结点使用属性n来控制,n表示当前结点的儿子结点的数目,叶子结点没有儿子。

  1 /* 456D */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 using namespace std;
 19 
 20 typedef struct trie_t {
 21     int n;
 22     int next[26];
 23     trie_t() {
 24         n = 0;
 25         memset(next, 0, sizeof(next));
 26     }
 27 } trie_t;
 28 
 29 const int maxn = 1e5+5;
 30 
 31 trie_t T[maxn];
 32 int L = 0;
 33 char s[maxn];
 34 int n, m;
 35 
 36 int newTrie() {
 37     return ++L;
 38 }
 39 
 40 void create(char *s, int rt) {
 41     int p = rt;
 42     int i = 0, id;
 43 
 44     while (s[i]) {
 45         id = s[i] - 'a';
 46         if (T[p].next[id] == 0) {
 47             T[p].next[id] = ++L;
 48             ++T[p].n;
 49         }
 50         p = T[p].next[id];
 51         ++i;
 52     }
 53 }
 54 
 55 int dfs(int rt) {
 56     int i;
 57     int st = 0;
 58     
 59     if (T[rt].n == 0)
 60         return 2;
 61 
 62     for (i=0; i<26; ++i) {
 63         if (T[rt].next[i])
 64             st |= dfs(T[rt].next[i]);
 65     }
 66     switch(st) {
 67     case 0:
 68         return 3;
 69     case 1:
 70         return 2;
 71     case 2:
 72         return 1;
 73     case 3:
 74         return 0;
 75     default:
 76         return 0;
 77     }
 78 }
 79 
 80 
 81 int main() {
 82     int i, j, k;
 83 
 84     #ifndef ONLINE_JUDGE
 85         freopen("data.in", "r", stdin);
 86         freopen("data.out", "w", stdout);
 87     #endif
 88 
 89     scanf("%d %d", &n, &m);
 90     // build trie
 91     for (i=0; i<n; ++i) {
 92         scanf("%s", s);
 93         create(s, 0);
 94     }
 95     // get the key point
 96     int st = 0;
 97     for (i=0; i<26; ++i) {
 98         if (T[0].next[i])
 99             st |= dfs(T[0].next[i]);
100     }
101     
102     if (st == 3) {
103         puts("First");
104         return 0;
105     } else if (st == 0) {
106         puts("Second");
107         return 0;
108     }
109     if (st == 1) {
110         puts("Second");
111         return 0;
112     }
113     if (m & 1) {
114         puts("First");
115     } else {
116         puts("Second");
117     }
118 
119     #ifndef ONLINE_JUDGE
120         printf("time = %d.
", (int)clock());
121     #endif
122 
123     return 0;
124 }
原文地址:https://www.cnblogs.com/bombe1013/p/4458105.html