Advertisement
Manioc

cultivando o odio

Jun 25th, 2018
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 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;
  12.     vector<int> travel;
  13.  
  14.     node() {
  15.         fill(word, word+ALPHA, (node*)0);
  16.         travel.clear();
  17.         link = (node*)0;
  18.         end = false;
  19.         mark = false;
  20.         id = -1;
  21.     }
  22. };
  23.  
  24. node* head;
  25.  
  26. int ans[MAX], biggest[MAX];
  27. vector<string> palavras;
  28.  
  29. bool compare(string a, string b) {
  30.     return a.size() < b.size();
  31. }
  32.  
  33. void add(string s, int id){
  34.     node* current = head;
  35.     //int biggest = 0;
  36.  
  37.     for(int i = 0; i < s.size(); i++){
  38.         int letra = s[i]-'a';
  39.  
  40.         if(!current->word[letra]) current->word[letra] = new node();
  41.  
  42.         //if(current->word[letra]->end) biggest = max(biggest, ans[current->word[letra]->id]);
  43.  
  44.         current->word[letra]->travel.push_back(id);
  45.         current = current->word[letra];
  46.     }
  47.     current->end = true;
  48.     current->id = id;
  49.     //ans[id] += biggest;
  50. }
  51.  
  52. void bfs(){
  53.     queue<node*> q;
  54.  
  55.     for(int i = 0; i < ALPHA; i++){
  56.         if(head->word[i]){
  57.             head->word[i]->link = head;
  58.             q.push(head->word[i]);
  59.  
  60.             if(head->word[i]->end){
  61.                 //cout << "ola = " << head->word[i]->id << "\n";
  62.  
  63.                 //cout << head->word[i]->id << " ->> " << ans[head->word[i]->id] << endl;
  64.                 ans[head->word[i]->id] += biggest[head->word[i]->id];
  65.                 //cout << head->word[i]->id << " ->> " << ans[head->word[i]->id] << endl;
  66.  
  67.                 for(int j = 0; j < head->word[i]->travel.size(); j++){
  68.                     //cout << head->word[i]->travel[j] << endl;
  69.                     biggest[head->word[i]->travel[j]]++;
  70.                 }
  71.             }
  72.         } else head->word[i] = head;
  73.     }
  74.  
  75.     while(!q.empty()){
  76.         node* pai = q.front();
  77.         q.pop();
  78.  
  79.         for(int i = 0; i < ALPHA; i++){
  80.             if(pai->word[i]){
  81.                 node* filho = pai->link;
  82.                 while(!filho->word[i]) filho = filho->link;
  83.                 filho = filho->word[i];
  84.                 pai->word[i]->link = filho;
  85.  
  86.                 while(!filho->end && filho->id != 0) filho = filho->link;
  87.                
  88.                 q.push(pai->word[i]);
  89.                 //cout << pai->word[i]->id << " : " << filho->id << endl;
  90.                 if(filho->end){
  91.                     //cout << "filho prodigo = " << filho->id << " (local = " << pai->word[i]->id << ")\n";
  92.                     for(int j = 0; j < pai->word[i]->travel.size(); j++){
  93.                         //cout << pai->word[i]->travel[j] << endl;
  94.                         biggest[pai->word[i]->travel[j]] = max(ans[filho->id], biggest[pai->word[i]->travel[j]]);
  95.                     }
  96.                 }
  97.  
  98.                 if(pai->word[i]->end){
  99.                     //cout << "fim = " << pai->word[i]->id << "\n";
  100.  
  101.  
  102.                     //cout << pai->word[i]->id << " ->> " << ans[pai->word[i]->id] << endl;
  103.                     ans[pai->word[i]->id] += biggest[pai->word[i]->id];
  104.                     //cout << pai->word[i]->id << " ->> " << ans[pai->word[i]->id] << endl;
  105.  
  106.                     for(int j = 0; j < pai->word[i]->travel.size(); j++){
  107.                         biggest[pai->word[i]->travel[j]] = max(ans[pai->word[i]->id], biggest[pai->word[i]->travel[j]]);
  108.                         //cout << pai->word[i]->travel[j] << " >>-- " << biggest[pai->word[i]->travel[j]]<< endl;
  109.                     }
  110.                 }
  111.             }
  112.         }
  113.     }
  114. }
  115. int main(){
  116.     while(true){
  117.         int qnt; cin >> qnt;
  118.         if(!qnt) break;
  119.  
  120.         for(int i = 0; i <= MAX; i++) {
  121.             ans[i] = 1;
  122.             biggest[i] = 0;
  123.         }
  124.         head = new node();
  125.         head->id = 0;
  126.         for(int i = 1; i <= qnt; i++){
  127.             string s; cin >> s;
  128.             //palavras.push_back(s);
  129.             add(s, i);
  130.         }
  131.         //sort(palavras.begin(), palavras.end(), compare);
  132.  
  133.         bfs();
  134.         int resp = 0;
  135.         for(int i = 0; i <= qnt; i++) resp = max(ans[i], resp);
  136.         cout << resp << endl;
  137.     }
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement