AC 自动机全 WA 求助!(悬关)
查看原帖
AC 自动机全 WA 求助!(悬关)
672281
InversionShadow楼主2024/4/26 17:06

rt.

#include <bits/stdc++.h>
#define int long long

using namespace std;

int n, m;

namespace AC_Automaton {
  const int N = 1e4 + 100;
  const int mod = 1e4 + 7;
  struct Node {
    int trie[26], fail, end;
  } tr[N];
  int cnt, dp[N][N];
  int qpow(int a, int b) {
    if (!b) return 1;
    int tmp = qpow(a, b / 2) % mod, ans = tmp % mod * tmp % mod;
    return (b & 1 ? ans * a % mod : ans);
  }
  void insert(string s) {
    int l = s.size(), tot = 0;
    s = ' ' + s;
    for (int i = 1; i <= l; i++) {
      int c = s[i] - 'A';
      if (!tr[tot].trie[c]) {
        tr[tot].trie[c] = ++cnt;
      }
      tot = tr[tot].trie[c];
    }
    tr[tot].end = 1;
  }
  void getfail() {
    queue<int> q;
    for (int i = 0; i < 26; i++) {
      if (tr[0].trie[i]) {
        q.push(tr[0].trie[i]);
      }
    }
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      for (int i = 0; i < 26; i++) {
	      if (tr[u].trie[i]) {
//	        cout << tr[u].trie[i] << endl;
	        tr[tr[u].trie[i]].fail = tr[tr[u].fail].trie[i];
	        tr[tr[u].trie[i]].end |= tr[tr[tr[u].trie[i]].fail].end; 
	        q.push(tr[u].trie[i]);
	      } else {
	        tr[u].trie[i] = tr[tr[u].fail].trie[i];
	      }
	    }
    }
  }
  void solve() {
    dp[0][0] = 1;
    for (int i = 1; i <= m; i++) {
      for (int j = 0; j <= cnt; j++) {
        for (int k = 0; k < 26; k++) {
          if (!tr[tr[i].trie[k]].end) {
            (dp[i][tr[i].trie[k]] += dp[i - 1][j]) %= mod;
          }
        }
      }
    }
    int ans = 0;
    for (int i = 0; i <= cnt; i++) {
      (ans += dp[m][i]) %= mod;
    }
    cout << (qpow(26, m) - ans + mod) % mod << endl;
  }
}

signed main() {
  using namespace AC_Automaton;
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    string s;
    cin >> s;
    AC_Automaton::insert(s);
  }
//  cout << "hi\n";
  AC_Automaton::getfail();
//  cout << "hi\n"; 
  AC_Automaton::solve();
  return 0;
} 
2024/4/26 17:06
加载中...