Advertisement
VisualPaul

Antifuck

Feb 26th, 2015
531
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.86 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. uint32_t hs1(uint32_t a, uint32_t b) {
  5.     return a + b * 1000000007;
  6. }
  7.  
  8. uint32_t hs2(uint32_t a, uint32_t b) {
  9.     return a + b * 0x7FFFFFFF;
  10. }
  11.  
  12. const uint32_t hts = 1200000;
  13. const uint32_t nul = 0xFFFFFFFF;
  14.  
  15. uint32_t hash_table[hts];
  16.  
  17.  
  18. uint32_t getElement(uint32_t a, uint32_t b) {
  19.     uint32_t h1 = hs1(a, b) % hts;
  20.     uint32_t h2 = hs2(a, b) % hts;
  21.     if (h2 == 0)
  22.         h2 = 1;
  23.     for (uint32_t h = h1; ; h = h + h2) {
  24.         if (h >= hts)
  25.             h -= hts;
  26.         if (hash_table[h] == nul)
  27.             return nul;
  28.         if ((hash_table[h] >> 17) == (h2 & 0x7FFF))
  29.             return hash_table[h] & 0x1FFFF;
  30.     }
  31. }
  32. void addElement(uint32_t a, uint32_t b, uint32_t x) {
  33.     uint32_t h1 = hs1(a, b) % hts;
  34.     uint32_t h2 = hs2(a, b) % hts;
  35.     if (h2 == 0)
  36.         h2 = 1;
  37.     uint32_t h;
  38.     for (h = h1; hash_table[h] != nul; h = h + h2, (h >= hts? h -= hts : 0)) {}
  39.     hash_table[h] = (h2 << 17) | x;
  40. }
  41.  
  42. struct node {
  43.     uint32_t suflink_and_number;
  44.     uint32_t prev_and_pchar;
  45. };
  46.  
  47. node nodes[100001];
  48. uint32_t freep = 1;
  49.  
  50. uint32_t addString(int number, FILE *f) {
  51.     uint32_t cur = 0;
  52.     uint32_t len = 0;
  53.     for (;;) {
  54.         int c = getc(f);
  55.         if (c == 0 || c == 13 || c == 10) {
  56.             ungetc(c, f);
  57.             break;
  58.         }
  59.         assert(c != EOF);
  60.         ++len;
  61.         uint32_t next = getElement(cur, (uint32_t)c);
  62.         if (next == nul) {
  63.             next = freep++;
  64.             nodes[next].prev_and_pchar = cur | (c << 17);
  65.             nodes[next].suflink_and_number = nul;
  66.             addElement(cur, c, next);
  67.         }
  68.         cur = next;
  69.     }
  70.     nodes[cur].suflink_and_number = 0x1FFFF | (number << 17);
  71.     return len;
  72. }
  73.  
  74. uint32_t suflink(uint32_t v);
  75. uint32_t go(uint32_t v, uint32_t c) {
  76.     uint32_t res = getElement(v, c);
  77.     if (res == nul) {
  78.         if (v == 0)
  79.             res = 0;
  80.         else
  81.             addElement(v, c, res = go(suflink(v), c));        
  82.     }
  83.     return res;
  84. }
  85.  
  86. uint32_t suflink(uint32_t v) {
  87.     uint32_t res = 0x1FFFF & nodes[v].suflink_and_number;
  88.     if (res == 0x1FFFF) {
  89.         if (v == 0 || (nodes[v].prev_and_pchar & 0x1FFFF) == 0) {
  90.             nodes[v].suflink_and_number ^= 0x1FFFF;
  91.             res = 0;
  92.         } else {
  93.             uint32_t c = nodes[v].prev_and_pchar >> 17;
  94.             uint32_t p = nodes[v].prev_and_pchar & 0x1FFFF;
  95.             nodes[v].suflink_and_number ^= 0x1FFFF ^ (res = go(suflink(p), c));
  96.         }
  97.     }
  98.     return res;
  99. }
  100.  
  101. uint32_t number(uint32_t v) {
  102.     if ((nodes[v].suflink_and_number >> 17) == 0x7FFF) {
  103.         if (v == 0) {
  104.             nodes[v].suflink_and_number ^= nul << 17;
  105.         } else {
  106.             nodes[v].suflink_and_number ^= (nul ^ number(suflink(v))) << 17;
  107.         }
  108.     }
  109.     return nodes[v].suflink_and_number >> 17;
  110. }
  111.  
  112. uint32_t len[10000];
  113.  
  114. void skipSpaces(FILE *f) {
  115.     while (getc(f) != '\n') {}
  116. }
  117.  
  118. int main() {
  119.     int n;
  120.     scanf("%d", &n);
  121.     memset(hash_table, -1, sizeof(hash_table));
  122.     for (int i = 1; i <= n; ++i) {
  123.         skipSpaces(stdin);
  124.         len[i - 1] = addString(i, stdin);
  125.     }
  126.     int m;
  127.     scanf("%d", &m);
  128.     for (int l = 1; l <= m; ++l) {
  129.         skipSpaces(stdin);
  130.         uint32_t cur = 0;
  131.         uint32_t mx = -1;
  132.         for (int i = 1; ; ++i) {
  133.             int c = getc(stdin);
  134.             if (c == 0 || c == 13 || c == 10) {
  135.                 ungetc(c, stdin);
  136.                 break;
  137.             }
  138.             assert(c != EOF);
  139.             cur = go(cur, c);
  140.             if (number(cur)) {
  141.                 uint32_t a = i - len[number(cur) - 1] + 1;
  142.                 if (a < mx)
  143.                     mx = a;
  144.             }
  145.         }
  146.         if (mx != 0xFFFFFFFF) {
  147.             printf("%d %u\n", l, mx);
  148.             return 0;
  149.         }
  150.     }
  151.     puts("Passed");
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement