Advertisement
double_trouble

aho-korasik

Apr 22nd, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.36 KB | None | 0 0
  1. //#define _CRT_SECURE_NO_WARNINGS
  2. #pragma comment(linker, "/STACK:16777216")
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <vector>
  6. #include <cmath>
  7. #include <string>
  8. #include <algorithm>
  9. #include <cstring>
  10. #include <deque>
  11. #include <iomanip>
  12. #include <cstddef>
  13. #include <queue>
  14. #include <set>
  15.  
  16.  
  17. using namespace std;
  18.  
  19. const int inf = 1000000000;
  20.  
  21. struct nod
  22. {
  23.     int next[100];
  24.     bool leaf;
  25.     int p, link, ch, len, f;
  26.     vector<int> ind;
  27. };
  28.  
  29. nod t[100000];
  30. int tsize;
  31.  
  32. void add_string(string s, int k)
  33. {
  34.     int v = 0;
  35.     for (int i = 0; i < s.size(); i++)
  36.     {
  37.         int l = s[i] - 'a';
  38.         if (t[v].next[l] != -1)
  39.             v = t[v].next[l];
  40.         else
  41.         {
  42.             nod n;
  43.             n.leaf = false;
  44.             n.ch = l;
  45.             n.link = -1;
  46.             n.p = v;
  47.             n.len = t[v].len + 1;
  48.             memset(n.next, -1, sizeof(int) * 100);
  49.             t[v].next[l] = tsize;
  50.             v = tsize;
  51.             t[tsize] = n;
  52.             tsize++;
  53.            
  54.         }
  55.     }
  56.  
  57.     t[v].leaf = true;
  58.     t[v].ind.push_back(k);
  59. }
  60.  
  61. int go(int, int);
  62. int get(int);
  63.  
  64. int go(int v, int ch)
  65. {
  66.     if (t[v].next[ch] != -1)
  67.         return t[v].next[ch];
  68.     if (v == 0)
  69.         return 0;
  70.     t[v].next[ch] = go(get(v), ch);
  71.     return t[v].next[ch];
  72. }
  73.  
  74. int get(int v)
  75. {
  76.     if (t[v].link != -1)
  77.         return t[v].link;
  78.     if (v == 0 || t[v].p == 0)
  79.     {
  80.         t[v].link = 0;
  81.         return 0;
  82.     }
  83.  
  84.     t[v].link = go(get(t[v].p), t[v].ch);
  85.     return t[v].link;
  86. }
  87.  
  88. bool findstring(string s)
  89. {
  90.     int v = 0;
  91.     for (int i = 0; i < s.size(); i++)
  92.     {
  93.         int l = s[i] - 'a';
  94.         if (t[v].next[l] == -1)
  95.             return false;
  96.         v = t[v].next[l];
  97.     }
  98.     return true;
  99. }
  100.  
  101. vector<int> a;
  102. vector<char> ans;
  103.  
  104. void finds(string s)
  105. {
  106.     int v = 0;
  107.     for (int i = 0; i < s.size(); i++)
  108.     {
  109.  
  110.         for (int v0 = v; v0 != 0; v0 = t[v0].f)
  111.         {
  112.             if (t[v0].leaf)
  113.             {
  114.                 for (int r = 0; r < t[v0].ind.size(); r++)
  115.                     ans[t[v0].ind[r]] = 'y';
  116.             }
  117.         }
  118.  
  119.         v = go(v, s[i] - 'a');
  120.     }
  121.  
  122.     for (int v0 = v; v0 != 0; v0 = t[v0].f)
  123.     {
  124.         if (t[v0].leaf)
  125.             for (int r = 0; r < t[v0].ind.size(); r++)
  126.                 ans[t[v0].ind[r]] = 'y';
  127.     }
  128.  
  129.         /*bool f = 0;
  130.         for (int j = i; j < s.size(); j++)
  131.         {
  132.             int l = s[j] - 'a';
  133.             if (t[v].next[l] != -1)
  134.                 v = t[v].next[l];
  135.             else
  136.             {
  137.                 f = 1;
  138.                 break;
  139.             }
  140.         }
  141.         if (f && !t[v].leaf)
  142.             continue;
  143.         int k = v;
  144.         while (k != 0)
  145.         {
  146.             if (t[k].leaf)
  147.             {
  148.                 ans[t[v].ind] = 'y';
  149.                 break;
  150.             }
  151.             k = t[v].f;
  152.         }
  153.         if (k != -1)
  154.             ans[t[v].ind] = 'y';
  155.     }
  156.     return;*/
  157. }
  158.  
  159. bool mycmp(const int &x, const int &y)
  160. {
  161.     return t[x].len < t[y].len;
  162. }
  163.  
  164. int main()
  165. {
  166.     ios_base::sync_with_stdio(0);
  167.     //freopen("input.txt", "r", stdin);//freopen("output.txt", "w", stdout);
  168.    
  169.     int tt;
  170.     cin >> tt;
  171.     string st, s;
  172.     while (tt--)
  173.     {
  174.         a.clear();
  175.         nod n;
  176.         n.ch = -1;
  177.         n.leaf = false;
  178.         n.link = 0;
  179.         n.f = 0;
  180.         n.p = -1;
  181.         n.len = 0;
  182.         memset(n.next, -1, sizeof(int) * 100);
  183.         t[0] = n;
  184.         tsize = 1;
  185.         cin >> st;
  186.         int k;
  187.         cin >> k;
  188.         ans.resize(k);
  189.         for (int i = 0; i < k; i++)
  190.         {
  191.             cin >> s;
  192.             add_string(s, i);
  193.         }
  194.  
  195.         for (int i = 0; i < tsize; i++)
  196.             a.push_back(i);
  197.        
  198.         sort(a.begin(), a.end(), mycmp);
  199.        
  200.         t[0].link = 0;
  201.         t[0].f = 0;
  202.         for (int i = 1; i < a.size(); i++)
  203.         {
  204.             int v = a[i];
  205.             int g = get(v);
  206.             int link = t[v].link;
  207.             if (t[link].leaf)
  208.                 t[v].f = link;
  209.             else
  210.                 t[v].f = t[link].f;
  211.         }
  212.  
  213.         ans.assign(k, 'n');
  214.         finds(st);
  215.         for (int i = 0; i < k; i++)
  216.             cout << ans[i] << endl;
  217.     }
  218.  
  219.     return 0;
  220. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement