Advertisement
pb_jiang

abc268d

Sep 16th, 2022
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <assert.h>
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  5. template <typename... Args> void logger(string vars, Args &&... values)
  6. {
  7.     cerr << vars << " = ";
  8.     string delim = "";
  9.     (..., (cerr << delim << values, delim = ", "));
  10.     cerr << endl;
  11. }
  12.  
  13. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  14. using ll = long long;
  15. using pii = pair<int, int>;
  16.  
  17. int n, m;
  18. namespace AC
  19. {
  20. const int MAXL = int(1e5 + 3);
  21. const int WIDTH = 27;
  22. int trie[MAXL << 4][WIDTH], hit[MAXL << 4], tcnt;
  23. int fail[MAXL << 4];
  24. void init()
  25. {
  26.     memset(fail, 0, sizeof(fail));
  27.     memset(trie, 0, sizeof(trie));
  28.     memset(hit, 0, sizeof(hit));
  29.     tcnt = 0;
  30. }
  31. void insert(const char *s)
  32. {
  33.     int u = 0;
  34.     for (int i = 0; s[i]; ++i) {
  35.         const int offset = (s[i] == '_' ? 26 : s[i] - 'a');
  36.         if (!trie[u][offset])
  37.             trie[u][offset] = ++tcnt;
  38.         u = trie[u][offset];
  39.     }
  40.     hit[u] = 1;
  41. }
  42. void build()
  43. {
  44.     queue<int> q;
  45.     for (int i = 0; i < WIDTH; ++i)
  46.         if (trie[0][i])
  47.             q.push(trie[0][i]);
  48.  
  49.     while (!q.empty()) {
  50.         int u = q.front();
  51.         q.pop();
  52.         for (int i = 0; i < WIDTH; ++i) {
  53.             if (trie[u][i]) {
  54.                 fail[trie[u][i]] = trie[fail[u]][i];
  55.                 q.push(trie[u][i]);
  56.             } else {
  57.                 trie[u][i] = trie[fail[u]][i];
  58.             }
  59.         }
  60.     }
  61. }
  62. int query(const char *s)
  63. {
  64.     int ret = 1;
  65.     int u = 0;
  66.     for (int i = 0; s[i]; ++i) {
  67.         const int offset = (s[i] == '_' ? 26 : s[i] - 'a');
  68.         u = trie[u][offset];
  69.         if (hit[u]) {
  70.             return 0;
  71.         }
  72.         if (u == 0)
  73.             return 1;
  74.     }
  75.     return ret;
  76. }
  77. }; // namespace AC
  78.  
  79. char s[8][1 << 5];
  80.  
  81. char ans[1 << 5];
  82. int dfs(char *permu[], int n, int arr_idx, int pos, int blank)
  83. {
  84.     if (arr_idx == n) {
  85.         ans[pos] = 0;
  86.         if (strlen(ans) < 3)
  87.             return 0;
  88.         int ret = AC::query(ans);
  89.         // fprintf(stderr, "ans:%s ret:%d\n", ans, ret);
  90.         return ret;
  91.     }
  92.     if (pos + strlen(permu[arr_idx]) > 16)
  93.         return 0;
  94.     int slen = strlen(permu[arr_idx]);
  95.     memcpy(ans + pos, permu[arr_idx], slen);
  96.     pos += slen;
  97.     if (arr_idx == n - 1) {
  98.         return dfs(permu, n, arr_idx + 1, pos, blank);
  99.     } else
  100.         for (int i = 0; i < blank - (n - pos - 1); ++i) {
  101.             ans[pos + i] = '_';
  102.             if (dfs(permu, n, arr_idx + 1, pos + i + 1, blank - i - 1))
  103.                 return 1;
  104.         }
  105.     return 0;
  106. }
  107.  
  108. int main(int argc, char **argv)
  109. {
  110.     char buf[1 << 5];
  111.     scanf("%d%d", &n, &m);
  112.     for (int i = 0; i < n; ++i)
  113.         scanf("%s", s[i]);
  114.  
  115.     AC::init();
  116.     for (int i = 0; i < m; ++i)
  117.         scanf("%s", buf), AC::insert(buf);
  118.     AC::build();
  119.  
  120.     if (n == 1 && strlen(s[0]) < 3) {
  121.         printf("-1\n");
  122.         return 0;
  123.     }
  124.     char *permu[8];
  125.     int len = 0;
  126.     for (int i = 0; i < n; ++i)
  127.         permu[i] = s[i], len += strlen(s[i]);
  128.  
  129.     do {
  130.         int ret = dfs(permu, n, 0, 0, 16 - len);
  131.         if (ret) {
  132.             printf("%s\n", ans);
  133.             return 0;
  134.         }
  135.     } while (next_permutation(permu, permu + n));
  136.  
  137.     printf("-1\n");
  138.     return 0;
  139. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement