Manioc

aho

Jun 24th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.89 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define MAX 10007
  3. #define ALPHA 26
  4.  
  5. using namespace std;
  6.  
  7. struct node{
  8.     struct node* word[ALPHA];
  9.     struct node* link;
  10.     bool end, mark;
  11.     int id_c;
  12.     vector<int> id;
  13.  
  14.     node(int id) : id_c(id) {
  15.         fill(word, word+ALPHA, (node*)0);
  16.         end = false;
  17.         mark = false;
  18.     }
  19. };
  20.  
  21. node* head;
  22.  
  23. int ans[MAX];
  24. vector<string> palavras;
  25.  
  26. bool compare(string a, string b) {
  27.     return a.size() < b.size();
  28. }
  29.  
  30. void add(string s, int id){
  31.     node* current = head;
  32.     int biggest = 0;
  33.    
  34.     for(int i = 0; i < s.size(); i++){
  35.         int letra = s[i]-'a';
  36.  
  37.         if(!current->word[letra]) current->word[letra] = new node(id);
  38.  
  39.         if(current->word[letra]->end){
  40.             int maior = 0;
  41.             for(int x = 0; x < current->word[letra]->id.size(); x++){
  42.                 maior = max(ans[current->word[letra]->id[x]], maior);
  43.             }
  44.             biggest = max(biggest, maior + 1);
  45.         }
  46.  
  47.         current = current->word[letra];
  48.     }
  49.     current->end = true;
  50.     current->id.push_back(id);
  51.     ans[id] += biggest;
  52. }
  53.  
  54. void bfs(int id){
  55.     queue<node*> q;
  56.     int biggest = 0;
  57.     for(int i = 0; i < ALPHA; i++){
  58.         if(head->word[i]){
  59.             head->word[i]->link = head;
  60.             q.push(head->word[i]);
  61.         }else head->word[i] = head;
  62.     }
  63.  
  64.     while(!q.empty()){
  65.         node* pai = q.front();
  66.         q.pop();
  67.  
  68.         for(int i = 0; i < ALPHA; i++){
  69.             if(pai->word[i]){
  70.                 node* filho = pai->link;
  71.                 while(!filho->word[i]) filho = filho->link;
  72.                 filho = filho->word[i];
  73.                
  74.                 pai->word[i]->link = filho;
  75.                 q.push(pai->word[i]);
  76.                 pai->word[i]->mark = true;
  77.  
  78.                 //cout << (char)('a'+i) << " --> " << filho->id_c << endl;
  79.                 if(filho->end){
  80.                     int maior = 0;
  81.                     for(int x = 0; x < filho->id.size(); x++){
  82.                         maior = max(ans[filho->id[x]], maior);
  83.                     }
  84.                    biggest = (maior + 1, biggest);
  85.                 }
  86.             }
  87.         }
  88.     }
  89.     ans[id] += biggest;
  90. }
  91. int main(){
  92.     int qnt; cin >> qnt;
  93.     for(int i = 0; i <= qnt; i++) ans[i] = 0;
  94.     head = new node(0);
  95.     for(int i = 1; i <= qnt; i++){
  96.         string s; cin >> s;
  97.         palavras.push_back(s);
  98.     }
  99.     sort(palavras.begin(), palavras.end(), compare);
  100.     for(int i = 1; i <= qnt; i++){
  101.         cout << "vou add\n";
  102.         add(palavras[i-1], i);
  103.         cout << "adionei\n";
  104.         bfs(i);
  105.         cout << "fiz os links\n";
  106.         cout << palavras[i-1] << endl;
  107.         for(int j = 0; j <= qnt; j++) cout << ans[j] << " ";
  108.         cout << endl;
  109.     }
  110.     int resp = 0;
  111.     for(int i = 0; i <= qnt; i++) resp = max(ans[i], resp);
  112.     cout << resp << endl;
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment