RedHotChiliPepper

Корась

Feb 5th, 2020
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. #pragma comment(linker, "/STACK:66777216")
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5.  
  6. #include <functional>
  7. #include <utility>
  8. #include <cmath>
  9. #include <algorithm>
  10. #include <cassert>
  11.  
  12. #include <vector>
  13. #include <set>
  14. #include <queue>
  15. #include <map>
  16. #include <stack>
  17. #include <unordered_map>
  18.  
  19. #include <string>
  20. #include <iterator>
  21. #include <iomanip>
  22. #include <fstream>
  23.  
  24. #include <random>
  25. #include <chrono>
  26.  
  27. using namespace std;
  28.  
  29. #define uint unsigned int
  30. #define prll pair<ll,ll>
  31. #define prdd pair<double,double>
  32. #define m_p make_pair
  33. #define ticonst (ll)1337228
  34. #define INF (ll)1e18
  35. #define ll int
  36.  
  37. const ll q = 239017;
  38. const ll mod = 1e9 + 7;
  39. const ll mod2 = 1e9 + 13;
  40. const ll MAXN = 1e6 + 100;
  41. const ll MAXM = 4294967291;
  42. const ll L = 26;
  43.  
  44. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  45. // if(clock() / (double)CLOCKS_PER_SEC >= t.0)
  46.  
  47. /*
  48. niyaz,your nose like garden hose!
  49.  🐊🔧🐊🔧🐊🔧🐊🔧🐊🔧🐊🔧
  50. */
  51.  
  52.  
  53. vector<ll> rs[MAXN];
  54. ll sz[MAXN];
  55.  
  56. struct Node
  57. {
  58.     //Node *to[26] = {}, *go[26] = {};
  59.     bitset <ll, Node*> to, go;
  60.  
  61.     bool t = 0;
  62.     vector<ll> term;
  63.  
  64.     Node *p, *link = 0, *tlink = 0;
  65.     ll pc;
  66.  
  67.     Node(Node *v, ll c)
  68.     {
  69.         p = v;
  70.         pc = c;
  71.     }
  72.  
  73. };
  74.  
  75. Node *root = new Node(0, -1);
  76.  
  77. void add(string &s, ll id)
  78. {
  79.     auto v = root;
  80.  
  81.     for (auto el : s)
  82.     {
  83.         ll c = el - 'a';
  84.  
  85.         if (!v->to[c])
  86.             v->to[c] = new Node(v, c);
  87.  
  88.         v = v->to[c];
  89.     }
  90.  
  91.     v->t = 1;
  92.     v->term.push_back(id);
  93. }
  94.  
  95. Node *_go(Node *v, ll c);
  96.  
  97. Node *_link(Node *v)
  98. {
  99.     if (!v->link)
  100.     {
  101.         if (v == root || v->p == root)
  102.             v->link = root;
  103.         else
  104.             v->link = _go(_link(v->p), v->pc);
  105.     }
  106.  
  107.     return v->link;
  108. }
  109.  
  110. Node *_go(Node *v, ll c)
  111. {
  112.     if (!v->go[c])
  113.     {
  114.         if (v->to[c])
  115.             v->go[c] = v->to[c];
  116.         else if (v == root)
  117.             v->go[c] = root;
  118.         else
  119.             v->go[c] = _go(_link(v), c);
  120.     }
  121.  
  122.     return v->go[c];
  123. }
  124.  
  125. Node *_tlink(Node *v)
  126. {
  127.     if (!v->tlink)
  128.     {
  129.         Node *u = _link(v);
  130.  
  131.         v->tlink = (u == root || u->t ? u : _tlink(u));
  132.     }
  133.  
  134.     return v->tlink;
  135. }
  136.  
  137. void $main()
  138. {
  139.     string s; cin >> s;
  140.  
  141.     ll m = (ll)s.size();
  142.  
  143.     ll n; cin >> n;
  144.     for (ll i = 1; i <= n; ++i)
  145.     {
  146.         string str; cin >> str;
  147.         add(str, i);
  148.  
  149.         sz[i] = (ll)str.size();
  150.     }
  151.  
  152.     auto v = root;
  153.     for (ll i = 0; i < m; ++i)
  154.     {
  155.         ll c = s[i] - 'a';
  156.  
  157.         v = _go(v, c);
  158.  
  159.         for (Node *fita = v; fita != root; fita = _tlink(fita))
  160.             if (fita->t)
  161.                 for (ll el : fita->term)
  162.                     rs[el].push_back(i + 2);
  163.     }
  164.  
  165.     for (ll i = 1; i <= n; ++i)
  166.     {
  167.         cout << (ll)rs[i].size() << " ";
  168.  
  169.         sort(rs[i].begin(), rs[i].end());
  170.         for (ll el : rs[i])
  171.             cout << el-sz[i] << " ";
  172.  
  173.         cout << '\n';
  174.     }
  175. }
  176.  
  177. int main()
  178. {
  179. #ifndef ONLINE_JUDGE
  180.     //freopen("input.txt", "r", stdin);
  181. #else
  182.     //freopen("wizard.in", "r", stdin);
  183.     //freopen("wizard.out", "w", stdout);
  184. #endif
  185.     ios_base::sync_with_stdio(0);
  186.     cin.tie(0), cout.tie(0);
  187.  
  188.     $main();
  189.  
  190.     return 0;
  191. }
  192.  
  193. //257593BA
Add Comment
Please, Sign In to add comment