1. 程式人生 > >Codeforces 291 E Tree-String Problem AC自動機

Codeforces 291 E Tree-String Problem AC自動機

mem 。。 麻煩 pll 全部 define efi div pair

Tree-String Problem

網上的dfs + kmp 復雜度就是錯的, 除非算出根據下一個字符直接轉移Next數組直接轉移, 而求出Next[ i ][ 26 ]數組和丟進AC自動機裏面沒有區別。。

然後我的AC自動機還寫麻煩了。。 我把全部都求進去求fail然後沿著fail推到目標串, 好蠢啊啊。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define
PLI pair<LL, int> #define PII pair<int, int> #define SZ(x) ((int)x.size()) #define ull unsigned long long using namespace std; const int N = 5e5 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1e9 + 7; const double eps = 1e-8; int n, p[N];
string s[N], t; vector<int> G[N]; vector<int> vc; struct Ac { int ch[N][26], f[N], tot, sz; int tar; LL val[N]; inline int newNode() { tot++; f[tot] = 0; val[tot] = 0; memset(ch[tot], 0, sizeof(ch[tot])); return tot; } void init(int
_sz) {sz = _sz; tot = -1; newNode();} inline int idx(int c) {return c - a;} void addStr(string& s) { int u = 0; for(int i = 0; i < SZ(s); i++) { int c = idx(s[i]); if(!ch[u][c]) ch[u][c] = newNode(); u = ch[u][c]; val[u]++; } tar = u; } void build() { queue<int> que; for(int c = 0; c < sz; c++) { int v = ch[0][c]; if(!v) ch[0][c] = 0; else f[v] = 0, que.push(v), vc.push_back(v); } while(!que.empty()) { int u = que.front(); que.pop(); for(int c = 0; c < sz; c++) { int v = ch[u][c]; if(!v) ch[u][c] = ch[f[u]][c]; else f[v] = ch[f[u]][c], que.push(v), vc.push_back(v); } } for(int i = SZ(vc) - 1; i >= 0; i--) val[f[vc[i]]] += val[vc[i]]; } void dfs(int x, int pos) { for(auto& y : G[x]) { int u = pos; for(int i = 0; i < SZ(s[y]); i++) { int c = idx(s[y][i]); if(!ch[u][c]) ch[u][c] = newNode(); u = ch[u][c]; val[u]++; } dfs(y, u); } } void solve() { init(26); cin >> n; for(int i = 2; i <= n; i++) { cin >> p[i] >> s[i]; G[p[i]].push_back(i); } cin >> t; addStr(t); dfs(1, 0); build(); printf("%lld\n", val[tar] - 1); } } ac; int main() { ac.solve(); return 0; } /* */

Codeforces 291 E Tree-String Problem AC自動機