Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.68 KB | None | 0 0
  1. #include<vector>
  2. #include<set>
  3. #include<map>
  4. #include<queue>
  5. #include<string>
  6. #include<algorithm>
  7. #include<iostream>
  8. #include<bitset>
  9. #include<functional>
  10. #include<numeric>
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<cstdlib>
  14. #include<cassert>
  15. #include<cmath>
  16. #include<random>
  17. #include<ctime>
  18. #include<complex>
  19. using namespace std;
  20. typedef long long LL;
  21. mt19937 gene(233);
  22. typedef complex<double> Complex;
  23. #define fi first
  24. #define se second
  25. #define ins insert
  26. #define pb push_back
  27. inline char GET_CHAR(){
  28.     const int maxn = 131072;
  29.     static char buf[maxn],*p1=buf,*p2=buf;
  30.     return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)?EOF:*p1++;
  31. }
  32. inline int getInt() {
  33.     int res(0);
  34.     char c = getchar();
  35.     while(c < '0') c = getchar();
  36.     while(c >= '0') {
  37.         res = res * 10 + (c - '0');
  38.         c = getchar();
  39.     }
  40.     return res;
  41. }
  42.  
  43. inline int fastpo(int x, int n, int mod) {
  44.     int res(1);
  45.     while(n) {
  46.         if(n & 1) {
  47.             res = res * (LL)x % mod;
  48.         }
  49.         x = x * (LL) x % mod;
  50.         n /= 2;
  51.     }
  52.     return res;
  53. }
  54.  
  55. inline string itoa(int x, int width = 0) {
  56.   string res;
  57.   if(x == 0) res.push_back('0');
  58.   while(x) {
  59.     res.push_back('0' + x % 10);
  60.     x /= 10;
  61.   }
  62.   while((int)res.size() < width) res.push_back('0');
  63.   reverse(res.begin(), res.end());
  64.   return res;
  65. }
  66.  
  67. const int N = 1000033;
  68. const int LOG = 20;
  69. const int mod = 1e9 + 7;
  70. const int inf = 1e9 + 7;
  71. int dx[4] = {1, 0, -1, 0};
  72. int dy[4] = {0, 1, 0, -1};
  73. const int A = 26;
  74. int sons[N][A], siz[N], fa[N], lst[N];
  75. const int MAXM = 2000010;
  76. struct SAM {
  77.     int tot, root, lst, mom[MAXM], mx[MAXM];
  78.     int ans[MAXM], ind[MAXM], acc[MAXM], nxt[MAXM][A];
  79.     int newNode() {
  80.         int res = ++tot;
  81.         fill(nxt[res], nxt[res] + A, 0);
  82.         mom[res] = mx[res] = acc[res] = 0;
  83.         return res;
  84.     }
  85.     void init() {
  86.         tot = 0;
  87.         root = newNode();
  88.         mom[root] = 0, mx[root] = 0;
  89.         lst = root;
  90.     }
  91.     int push(int lst, int c) {
  92.         int p = lst;
  93.         int np = nxt[p][c] ? 0 : newNode();
  94.         mx[np] = mx[p] + 1;
  95.         for(;  p && nxt[p][c] == 0; p = mom[p])
  96.             nxt[p][c] = np;
  97.         if(p == 0) mom[np] = root;
  98.         else {
  99.             int q = nxt[p][c];
  100.             if(mx[p] + 1 == mx[q]) mom[np] = q;
  101.             else {
  102.                 int nq = newNode();
  103.                 mx[nq] = mx[p] + 1;
  104.                 for(int i = 0; i < A; i++) {
  105.                     nxt[nq][i] = nxt[q][i];
  106.                 }
  107.                 mom[nq] = mom[q];
  108.                 mom[q] = nq;
  109.                 mom[np] = nq;
  110.                 for(; p && nxt[p][c] == q; p = mom[p]) nxt[p][c] = nq;
  111.             }
  112.         }
  113.         int res = np ? np : mom[np];
  114.         ans[res]++;
  115.         return res;
  116.     }
  117.     int calc(char * st) {
  118.         int p = 1;
  119.         for(int j = strlen(st) - 1; j >= 0; j--) {
  120.             int c = st[j] - 'A';
  121.             if(nxt[p][c]) {
  122.                 p = nxt[p][c];
  123.             }else  return 0;
  124.         }
  125.         return ans[p];
  126.     }
  127.     void calcdp() {
  128.         for(int i = 1; i <= tot; i++) {
  129.             for(int c = 0; c < A; c++) {
  130.                 //printf("ic %d %d\n", i, c);
  131.                 if(nxt[i][c]) {
  132.                     ind[nxt[i][c]]++;
  133.                     printf("!%d %d %d\n", i, c, nxt[i][c]);
  134.                 }
  135.             }
  136.         }
  137.         vector<int> q;
  138.         for(int i = 1; i <= tot; i++) {
  139.             printf("%d %d\n", i, ind[i]);
  140.             if(ind[i] == 0) {
  141.             q.pb(i);
  142.         }
  143.         }
  144.         for(int op = 0; op < (int)q.size(); op++)  {
  145.             int v = q[op];
  146.             for(int c = 0; c < A; c++) {
  147.                 int y = nxt[v][c];
  148.                 if(y != 0) --ind[y];
  149.                 if(y != 0 && ind[y] == 0) {
  150.                     q.push_back(y);
  151.                 }
  152.             }
  153.         }
  154.         for(int op = tot - 1; op >= 0; op--) {
  155.             int v = q[op];
  156.             for(int c = 0;c < A; c++) {
  157.                 int y = nxt[v][c];
  158.                 if(y) ans[v] += ans[y];
  159.             }
  160.         }
  161.     }
  162. } sam;
  163. int main() {
  164.     int n, k;
  165.     sam.init();
  166.     scanf("%d%d", &n, &k);
  167.     for(int i(1); i <= n; i++) {
  168.         static char st[11];
  169.         int p;
  170.         scanf("%s%d", st, &p);
  171.         sam.push(lst[p], st[0] - 'A');
  172.     }
  173.     sam.calcdp();
  174.     for(int i = 1; i <= k; i++) {
  175.         static char st[N];
  176.         scanf("%s", st);
  177.         printf("%d\n", sam.calc(st));
  178.     }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement