Advertisement
leanchec

Untitled

May 18th, 2024
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int K=10;
  5.  
  6. bool passei[303][33000], achou;
  7.  
  8. struct Vertex{
  9.     int next[K];
  10.     bool kind=false;
  11.     int slink=-1, mask=0, pai=-1, ch=-1;
  12.     Vertex(){
  13.         memset(next, -1, sizeof next);
  14.     }
  15. };
  16.  
  17. vector<Vertex> trie(1);
  18.  
  19. void add_string(string a, bool bad, int val){
  20.     int v=0;
  21.     for(auto ch:a){
  22.         int c=ch-'a';
  23.         if(trie[v].next[c]==-1){
  24.             trie[v].next[c]=trie.size();
  25.             trie.emplace_back();
  26.  
  27.             trie[trie[v].next[c]].pai=v;
  28.             trie[trie[v].next[c]].ch=c;
  29.         }
  30.         v=trie[v].next[c];
  31.     }
  32.     if(bad)trie[v].mask=val;
  33.     else trie[v].kind=true;
  34. }
  35.  
  36. int main(){
  37.     ios_base::sync_with_stdio(0); cin.tie(0);
  38.     int n, m, tam=0;
  39.     cin >> n >> m;
  40.  
  41.     for(int i=0; i<n; i++){
  42.         string a;
  43.         cin >> a;
  44.         add_string(a, true, (1<<i));
  45.         tam+=a.size();
  46.     }
  47.  
  48.     for(int i=0; i<m; i++){
  49.         string a;
  50.         cin >> a;
  51.         add_string(a, false, 0);
  52.         tam+=a.size();
  53.     }
  54.  
  55.  
  56.     queue<int> q;
  57.     q.push(0);
  58.  
  59.     for(int i=0; i<K; i++)
  60.         if(trie[0].next[i]==-1)trie[0].next[i]=0;
  61.  
  62.     while(q.size()){
  63.         int cur=q.front();
  64.         q.pop();
  65.  
  66.         if(trie[cur].pai==0 || cur==0)trie[cur].slink=0;
  67.         else if(trie[cur].pai!=-1){
  68.             int atual=trie[trie[cur].pai].slink;
  69.  
  70.             while(1){
  71.                 if(trie[atual].next[trie[cur].ch]!=-1){
  72.                     trie[cur].slink=trie[atual].next[trie[cur].ch];
  73.                     break;
  74.                 }
  75.                 else if(atual==0){
  76.                     trie[cur].slink=0;
  77.                     break;
  78.                 }
  79.                 else atual=trie[atual].slink;
  80.             }
  81.         }
  82.  
  83.         for(int i=0; i<K; i++){
  84.             if(trie[cur].next[i]<=0){
  85.                 trie[cur].next[i]=trie[trie[cur].slink].next[i];
  86.             }
  87.             else q.push(trie[cur].next[i]);
  88.         }
  89.  
  90.         trie[cur].kind|=trie[trie[cur].slink].kind;
  91.         trie[cur].mask|=trie[trie[cur].slink].mask;
  92.  
  93.     }
  94.  
  95.     queue<pair<pair<int,int>,string>> bfs;
  96.     bfs.push({{0, 0}, ""});
  97.  
  98.     while(bfs.size()){
  99.         auto cur=bfs.front();
  100.         bfs.pop();
  101.         int v=cur.first.first, mask=(cur.first.second|trie[v].mask);
  102.  
  103.         if(mask==((1<<n)-1)){
  104.             cout << cur.second << '\n';
  105.             achou=true;
  106.             break;
  107.         }
  108.  
  109.         for(int i=0; i<K; i++){
  110.             int prox=trie[v].next[i];
  111.  
  112.             if(trie[prox].kind || passei[prox][mask])continue;
  113.             passei[prox][mask]=true;
  114.  
  115.             bfs.push({{prox, mask}, cur.second+char('a'+i)});
  116.  
  117.         }
  118.     }
  119.  
  120.     if(!achou)cout << "-\n";
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement