Advertisement
pb_jiang

abc268d ac

Sep 16th, 2022
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 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 u = 0;
  65.     for (int i = 0; s[i]; ++i) {
  66.         const int offset = (s[i] == '_' ? 26 : s[i] - 'a');
  67.         u = trie[u][offset];
  68.         if (u == 0)
  69.             return 1;
  70.     }
  71.     if (hit[u]) {
  72.         return 0;
  73.     }
  74.     return 1;
  75. }
  76. }; // namespace AC
  77.  
  78. char s[8][1 << 5];
  79.  
  80. char ans[1 << 5];
  81. int dfs(char *permu[], int n, int arr_idx, int pos, int blank)
  82. {
  83.     if (arr_idx == n) {
  84.         ans[pos] = 0;
  85.         if (strlen(ans) < 3)
  86.             return 0;
  87.         int ret = AC::query(ans);
  88.         // fprintf(stderr, "ans:%s ret:%d\n", ans, ret);
  89.         return ret;
  90.     }
  91.     if (pos + strlen(permu[arr_idx]) > 16)
  92.         return 0;
  93.     int slen = strlen(permu[arr_idx]);
  94.     memcpy(ans + pos, permu[arr_idx], slen);
  95.     pos += slen;
  96.     if (arr_idx == n - 1) {
  97.         return dfs(permu, n, arr_idx + 1, pos, blank);
  98.     } else
  99.         for (int i = 0; i < blank - (n - pos - 1); ++i) {
  100.             ans[pos + i] = '_';
  101.             if (dfs(permu, n, arr_idx + 1, pos + i + 1, blank - i - 1))
  102.                 return 1;
  103.         }
  104.     return 0;
  105. }
  106.  
  107. int main(int argc, char **argv)
  108. {
  109.     char buf[1 << 5];
  110.     scanf("%d%d", &n, &m);
  111.     for (int i = 0; i < n; ++i)
  112.         scanf("%s", s[i]);
  113.  
  114.     AC::init();
  115.     for (int i = 0; i < m; ++i)
  116.         scanf("%s", buf), AC::insert(buf);
  117.     // AC::build();
  118.  
  119.     if (n == 1 && strlen(s[0]) < 3) {
  120.         printf("-1\n");
  121.         return 0;
  122.     }
  123.     char *permu[8];
  124.     int len = 0;
  125.     for (int i = 0; i < n; ++i)
  126.         permu[i] = s[i], len += strlen(s[i]);
  127.  
  128.     do {
  129.         int ret = dfs(permu, n, 0, 0, 16 - len);
  130.         if (ret) {
  131.             printf("%s\n", ans);
  132.             return 0;
  133.         }
  134.     } while (next_permutation(permu, permu + n));
  135.  
  136.     printf("-1\n");
  137.     return 0;
  138. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement