Advertisement
Josif_tepe

Untitled

Dec 7th, 2023
895
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. using namespace std;
  5. const int alphabet_size = 2;
  6. struct node {
  7.     node * children_of_node[alphabet_size];
  8.     bool is_end_of_word;
  9.     node () {
  10.         is_end_of_word = false;
  11.         for(int i = 0; i < alphabet_size; i++) {
  12.             children_of_node[i] = NULL;
  13.         }
  14.     }
  15. };
  16. void insert_word(node * trie, string word) {
  17.     node * tmp = trie;
  18.     for(int i = 0; i < (int) word.size(); i++) {
  19.         int c = word[i] - 'a';
  20.         if(tmp -> children_of_node[c] == NULL) {
  21.             tmp -> children_of_node[c] = new node();
  22.         }
  23.         tmp = tmp -> children_of_node[c];
  24.     }
  25.     tmp -> is_end_of_word = true;
  26. }
  27. bool search_word(node * trie, string word) {
  28.     node * tmp = trie;
  29.    
  30.     for(int i = 0; i < (int) word.size(); i++) {
  31.         int c = word[i] - 'a';
  32.         if(tmp -> children_of_node[c] == NULL) {
  33.             return false;
  34.         }
  35.         tmp = tmp -> children_of_node[c];
  36.     }
  37.     return tmp -> is_end_of_word;
  38. }
  39. void delete_word(node * trie, string word) {
  40.     node * tmp = trie;
  41.     for(int i = 0; i < (int) word.size(); i++) {
  42.         int c = word[i] - 'a';
  43.         if(tmp -> children_of_node[c] == NULL) {
  44.             return;
  45.         }
  46.         tmp = tmp -> children_of_node[c];
  47.     }
  48.     tmp -> is_end_of_word = false;
  49. }
  50.  
  51.  
  52. int main() {
  53.     ios_base::sync_with_stdio(false);
  54.     int n;
  55.     cin >> n;
  56.    
  57.     vector<string> v(n);
  58.     for(int i = 0; i < n; i++) {
  59.         cin >> v[i];
  60.     }
  61.     for(int i = 0; i < n; i++) {
  62.         for(int j = i + 1; j < n; j++) {
  63.             if((int) v[i].size() > (int) v[j].size()) {
  64.                 swap(v[i], v[j]);
  65.             }
  66.         }
  67.     }
  68.    
  69.     node * trie[n + 1];
  70.     for(int i = 0; i < n; i++) {
  71.         trie[i] = new node();
  72.     }
  73.     for(int i = 1; i < n; i++) {
  74.         for(int j = 0; j < (int) v[i].size(); j++) {
  75.             string tmp = "";
  76.             for(int k = j; k < min(j + 60, (int) v[i].size()); k++) {
  77.                 tmp += v[i][k];
  78.                 insert_word(trie[i], tmp);
  79.             }
  80.         }
  81.     }
  82.     int res = 0;
  83.     for(int i = 0; i < (int) v[0].size(); i++) {
  84.         string tmp = "";
  85.         for(int j = i; j < min(i + 60, (int) v[0].size()); j++) {
  86.             tmp += v[0][j];
  87.             bool ok = true;
  88.             for(int k = 1; k < n; k++) {
  89.                 if(!search_word(trie[k], tmp)) {
  90.                     ok = false;
  91.                     break;
  92.                 }
  93.             }
  94.             if(ok) {
  95.                 res = max(res, (int) tmp.size());
  96.             }
  97.         }
  98.     }
  99.     cout << res << endl;
  100.     return 0;
  101. }
  102.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement