const int Maxn = 1e6;
const int Maxkind = 26;
struct Ac_Automata {
int cnt;
int End[Maxn + 5];
int Tire[Maxkind + 5][Maxn + 5];
int dout[Maxn + 5];
void Init () {
memset (dout, 0, sizeof dout);
memset (Tire, 0, sizeof Tire);
memset (End, 0, sizeof End);
}
void Insert (char *str) {
int len = strlen (str + 1);
int p = 0;
rep (i, 1, len) {
int ch = str[i] - 'a' + 1;
if (Tire[ch][p] == 0) Tire[ch][p] = ++cnt;
p = Tire[ch][p];
}
End[p]++;
}
void Get_Next () {
queue <int> q;
rep (i, 1, Maxkind) if (Tire[i][0]) q.push (Tire[i][0]);
while (q.size ()) {
int u = q.front (); q.pop ();
rep (ch, 1, Maxkind) {
int v = Tire[ch][u];
if (v != 0) {
Tire[0][v] = Tire[ch][Tire[0][u]];
dout[Tire[ch][Tire[0][u]]]++;
q.push (v);
}
else {
Tire[ch][u] = Tire[ch][Tire[0][u]];
}
}
}
}
bool vis[Maxn + 5];
int Query (char *str) {
int len = strlen (str + 1);
int p = 0;
rep (i, 1, len) {
int ch = str[i] - 'a' + 1;
p = Tire[ch][p];
vis[p] = 1;
}
int res = 0;
queue <int> q;
rep (i, 1, cnt)
if (dout[i] == 0)
q.push (i);
while (q.size ()) {
int u = q.front (); q.pop ();
res += vis[u] * End[u];
vis[Tire[0][u]] |= vis[u];
dout[Tire[0][u]]--;
if (dout[Tire[0][u]] == 0) {
q.push (Tire[0][u]);
}
}
return res;
}
}Tree;
ac自动机模板
最新推荐文章于 2024-04-28 22:37:46 发布