Advertisement
Josif_tepe

Untitled

Dec 7th, 2023
812
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <map>
  5. using namespace std;
  6. typedef long long ll;
  7. const int maxn = 205;
  8. int n, o;
  9. const int alphabet_size = 26;
  10. int trie[maxn][alphabet_size];
  11. ll dp[alphabet_size][1 << 9][maxn];
  12. map<int, int> at_trie_end_of_word;
  13. ll rek(int at, int visited, int at_trie) {
  14.     if(at == o and __builtin_popcount(visited) == n) {
  15.         return 1;
  16.     }
  17.     if(at >= o) {
  18.         return 0;
  19.     }
  20.     if(dp[at][visited][at_trie] != -1) {
  21.         return dp[at][visited][at_trie];
  22.     }
  23.     ll res = 0;
  24.     for(int i = 0; i < 26; i++) {
  25.         int c = trie[at_trie][i];
  26.         res += rek(at + 1, visited | at_trie_end_of_word[c], c);
  27.     }
  28.     return dp[at][visited][at_trie] = res;
  29. }
  30. int main() {
  31.     ios_base::sync_with_stdio(false);
  32.     memset(dp, -1, sizeof dp);
  33.     cin >> o >> n;
  34.     vector<string> v(n);
  35.    
  36.     for(int i = 0; i < n; i++) {
  37.         cin >> v[i];
  38.     }
  39.     map<string, int> m1;
  40.     map<int, string> m2;
  41.     int cnt = 1;
  42.     for(int i = 0; i < n; i++) {
  43.         string tmp = "";
  44.         for(int j = 0; j < (int) v[i].size(); j++) {
  45.             tmp += v[i][j];
  46.             m1[tmp] = cnt;
  47.             m2[cnt] = tmp;
  48.             cnt++;
  49.         }
  50.     }
  51.     m1[""] = 0;
  52.     m2[0] = "";
  53.     for(int i = 0; i <= 100; i++) {
  54.         if(m2.find(i) != m2.end()) {
  55.             for(int j = 0; j < n; j++) {
  56.                 if((int) m2[i].size() >= (int) v[j].size() and m2[i].find(v[j]) != string::npos) {
  57.                     at_trie_end_of_word[i] |= (1 << j);
  58.                 }
  59.             }
  60.         }
  61.         string tmp = "";
  62.         for(int j = 0; j < 26; j++) {
  63.             tmp = m2[i] + (char) (j + 'a');
  64.             while(m1.find(tmp) == m1.end()) {
  65.                 tmp.erase(tmp.begin());
  66.             }
  67.             trie[i][j] = m1[tmp];
  68.         }
  69.        
  70.     }
  71.     cout << rek(0, 0, 0) << endl;
  72.     return 0;
  73. }
  74.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement