Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int K=10;
- bool passei[303][33000], achou;
- struct Vertex{
- int next[K];
- bool kind=false;
- int slink=-1, mask=0, pai=-1, ch=-1;
- Vertex(){
- memset(next, -1, sizeof next);
- }
- };
- vector<Vertex> trie(1);
- void add_string(string a, bool bad, int val){
- int v=0;
- for(auto ch:a){
- int c=ch-'a';
- if(trie[v].next[c]==-1){
- trie[v].next[c]=trie.size();
- trie.emplace_back();
- trie[trie[v].next[c]].pai=v;
- trie[trie[v].next[c]].ch=c;
- }
- v=trie[v].next[c];
- }
- if(bad)trie[v].mask=val;
- else trie[v].kind=true;
- }
- int main(){
- ios_base::sync_with_stdio(0); cin.tie(0);
- int n, m, tam=0;
- cin >> n >> m;
- for(int i=0; i<n; i++){
- string a;
- cin >> a;
- add_string(a, true, (1<<i));
- tam+=a.size();
- }
- for(int i=0; i<m; i++){
- string a;
- cin >> a;
- add_string(a, false, 0);
- tam+=a.size();
- }
- queue<int> q;
- q.push(0);
- for(int i=0; i<K; i++)
- if(trie[0].next[i]==-1)trie[0].next[i]=0;
- while(q.size()){
- int cur=q.front();
- q.pop();
- if(trie[cur].pai==0 || cur==0)trie[cur].slink=0;
- else if(trie[cur].pai!=-1){
- int atual=trie[trie[cur].pai].slink;
- while(1){
- if(trie[atual].next[trie[cur].ch]!=-1){
- trie[cur].slink=trie[atual].next[trie[cur].ch];
- break;
- }
- else if(atual==0){
- trie[cur].slink=0;
- break;
- }
- else atual=trie[atual].slink;
- }
- }
- for(int i=0; i<K; i++){
- if(trie[cur].next[i]<=0){
- trie[cur].next[i]=trie[trie[cur].slink].next[i];
- }
- else q.push(trie[cur].next[i]);
- }
- trie[cur].kind|=trie[trie[cur].slink].kind;
- trie[cur].mask|=trie[trie[cur].slink].mask;
- }
- queue<pair<pair<int,int>,string>> bfs;
- bfs.push({{0, 0}, ""});
- while(bfs.size()){
- auto cur=bfs.front();
- bfs.pop();
- int v=cur.first.first, mask=(cur.first.second|trie[v].mask);
- if(mask==((1<<n)-1)){
- cout << cur.second << '\n';
- achou=true;
- break;
- }
- for(int i=0; i<K; i++){
- int prox=trie[v].next[i];
- if(trie[prox].kind || passei[prox][mask])continue;
- passei[prox][mask]=true;
- bfs.push({{prox, mask}, cur.second+char('a'+i)});
- }
- }
- if(!achou)cout << "-\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement