Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2014
769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <cassert>
  7. #include <memory.h>
  8.  
  9. #include <iostream>
  10. #include <string>
  11. #include <vector>
  12. #include <algorithm>
  13. #include <set>
  14. #include <map>
  15. #include <queue>
  16. #include <deque>
  17. #include <list>
  18. #include <complex>
  19.  
  20. using namespace std;
  21.  
  22. #define INF 1000000001
  23. #define INFL 1000000000000000001ll
  24. #define pb push_back
  25. #define fi first
  26. #define se second
  27. #define mp make_pair
  28. #define sz(x) ((int) (x).size())
  29.  
  30. typedef long long ll;
  31. typedef long double ld;
  32. typedef complex <ld> point;
  33.  
  34. #define NAME "guess"
  35.  
  36. map <pair <string, vector <char> >, char> ans;
  37. int n, len;
  38. vector <string> str[10];
  39. char buf[10];
  40. char sym[10001];
  41. int alpha;
  42.  
  43. inline void clear() {
  44.     ans.clear();
  45.     alpha = 0;
  46.     for (int i = 1; i <= 6; ++i)
  47.         str[i].clear();
  48. }
  49.  
  50. inline char empty_set(string &s, vector <char> &bad) {
  51.     for (int i = 0; i < (int) str[len].size(); ++i) {
  52.         char ok = 1;
  53.         for (int j = 0; j < len; ++j)
  54.             if (s[j] != '*' && s[j] != str[len][i][j])
  55.                 ok = 0, j = 1000;
  56.         if (!ok)
  57.             continue;
  58.         for (int j = 0; j < len; ++j)
  59.             for (int k = 0; k < (int) bad.size(); ++k)
  60.                 if (bad[k] == str[len][i][j])
  61.                     ok = 0, j = 1000, k = 1000;
  62.         if (!ok)
  63.             continue;
  64.         return 0;
  65.     }
  66.     return 1;
  67. }
  68.  
  69. inline void v_insert(vector <char> &v, char sym) {
  70.     int pos = v.size();
  71.     v.pb(sym);
  72.     while (pos > 0 && v[pos - 1] > v[pos])
  73.         swap(v[pos - 1], v[pos]), --pos;
  74. }
  75.  
  76. inline void v_erase(vector <char> &v, char sym) {
  77.     for (int i = 0; i < (int) v.size(); ++i)
  78.         if (v[i] == sym) {
  79.             for (int j = i + 1; j < (int) v.size(); ++j)
  80.                 v[j - 1] = v[j];
  81.             v.pop_back();
  82.             return;
  83.         }
  84. }
  85.  
  86. inline char guessed(string &s) {
  87.     for (int i = 0; i < len; ++i)
  88.         if (s[i] == '*')
  89.             return 0;
  90.     return 1;
  91. }
  92.  
  93. inline char calc(string &s, vector <char> &bad) {
  94.     //~ cerr << s << ' ';
  95.     //~ for (int i = 0; i < (int) bad.size(); ++i)
  96.         //~ cerr << bad[i];
  97.     //~ cerr << '\n';
  98.     if (ans.count(mp(s, bad)))
  99.         return ans[mp(s, bad)];
  100.     if (empty_set(s, bad))
  101.         return ans[mp(s, bad)] = 0;
  102.     if ((int) bad.size() > len)
  103.         return ans[mp(s, bad)] = 1;
  104.     if (guessed(s))
  105.         return ans[mp(s, bad)] = 0;
  106.     for (int i = 0; i < alpha; ++i) {
  107.         char ok = 1;
  108.         for (int j = 0; j < (int) bad.size(); ++j)
  109.             if (bad[j] == sym[i])
  110.                 ok = 0, j = 1000;
  111.         for (int j = 0; j < len; ++j)
  112.             if (s[j] == sym[i])
  113.                 ok = 0, j = 1000;
  114.         if (!ok)
  115.             continue;
  116.         v_insert(bad, sym[i]);
  117.         if (calc(s, bad)) {
  118.             v_erase(bad, sym[i]);
  119.             continue;
  120.         }
  121.         v_erase(bad, sym[i]);
  122.         for (int j = 0; j < len; ++j) {
  123.             if (s[j] != '*')
  124.                 continue;
  125.             s[j] = sym[i];
  126.             if (calc(s, bad)) {
  127.                 ok = 0;
  128.                 s[j] = '*';
  129.                 break;
  130.             }
  131.             s[j] = '*';
  132.         }
  133.         if (!ok)
  134.             continue;
  135.         return ans[mp(s, bad)] = 0;
  136.     }
  137.     return ans[mp(s, bad)] = 1;
  138. }
  139.  
  140. inline void solve() {
  141.     scanf("%d", &n);
  142.     for (int i = 0; i < n; ++i) {
  143.         scanf("%s", buf);
  144.         str[strlen(buf)].pb(buf);
  145.         for (int j = 0; buf[j]; ++j)
  146.             sym[alpha++] = buf[j];
  147.     }
  148.     sort(sym, sym + alpha);
  149.     alpha = unique(sym, sym + alpha) - sym;
  150.     //~ cerr << alpha << '\n';
  151.     string empty = "";
  152.     vector <char> empty_bad(0);
  153.     for (len = 1; len < 7; ++len) {
  154.         empty += '*';
  155.         assert(empty_bad.empty());
  156.         if (calc(empty, empty_bad)) {
  157.             cout << "Yes\n";
  158.             clear();
  159.             return;
  160.         }
  161.     }
  162.     cout << "No\n";
  163.     clear();
  164. }
  165.  
  166. int main() {
  167.     srand(time(0));
  168.     cout.setf(ios::fixed);
  169.     cout.precision(10);
  170.     #ifdef _GEANY
  171.     assert(freopen(NAME ".in", "r", stdin));
  172.     #endif
  173.     int tn;
  174.     cin >> tn;
  175.     for (int i = 0; i < tn; ++i)
  176.         solve();
  177. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement