Advertisement
Manioc

suffix automata

Nov 7th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define optimizar_io ios_base::sync_with_stdio(0);cin.tie(0);
  3.  
  4. using namespace std;
  5.  
  6. struct state {
  7.   int len, link;
  8.   int next[58];
  9. };
  10.  
  11. const int MN = 100007;
  12. state sa[2*MN];
  13. int sz, last;
  14.  
  15. void sa_init() {
  16.   sz = 1;
  17.   last = 0;
  18.   sa[0].len = 0;
  19.   sa[0].link = -1;
  20.   for(int i = 0; i < 58; i++) sa[0].next[i] = 0;
  21. }
  22.  
  23. void sa_extend(int c) {
  24.   int cur = sz++;
  25.   sa[cur].len = sa[last].len + 1;
  26.   for(int i = 0; i < 58; i++) sa[cur].next[i] = 0;
  27.  
  28.   int p;
  29.   for (p = last; p != -1 && !sa[p].next[c]; p = sa[p].link) sa[p].next[c] = cur;
  30.  
  31.   if (p == -1) {
  32.     sa[cur].link = 0;
  33.   } else {
  34.     int q = sa[p].next[c];
  35.     if (sa[p].len + 1 == sa[q].len) {
  36.       sa[cur].link = q;
  37.     } else {
  38.       int clone = sz++;
  39.       sa[clone].len = sa[p].len + 1;
  40.       for (int i = 0; i < 58; i++){
  41.           sa[clone].next[i] = sa[q].next[i];
  42.       }
  43.       sa[clone].link = sa[q].link;
  44.       for (; p!= -1 && sa[p].next[c] == q; p = sa[p].link) {
  45.         sa[p].next[c] = clone;
  46.       }
  47.       sa[q].link = sa[cur].link = clone;
  48.     }
  49.   }
  50.   last = cur;
  51. }
  52.  
  53. vector<int>d(MN,0);
  54.  
  55. long long conta_substrings(){
  56.     long long ret=0;
  57.     for( int i=1 ; i<sz ; i++ ){
  58.     ret +=sa[i].len-sa[sa[i].link].len;
  59.     }
  60.     return ret;
  61. }
  62.  
  63. void ext(char i){
  64.     sa_extend(i-'A');
  65. }
  66. int main() {
  67.   optimizar_io;
  68.   int num;
  69.   cin >> num;
  70.   while(num--){
  71.     string line;
  72.     cin >> line;
  73.     sa_init();
  74.     for_each (line.begin(), line.end(), ext);
  75.     int um = conta_substrings();
  76.     string seg;
  77.     cin >> seg;
  78.   }
  79.   return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement