当前位置:首页 / 文章测试 / AC自动机

AC自动机

开始打字练习

#include

using namespace std;

const int N = 10010, S = 55, M = 1000010;

int n;

int tr[N * S][26], cnt[N * S], idx;

char str[M];

int q[N * S], ne[N * S];

void insert() {

int p = 0;

for (int i = 0; str[i]; ++i) {

int t = str[i] - 'a';

if (!tr[p][t]) tr[p][t] = ++idx;

p = tr[p][t];

}

++cnt[p];

}

void build() {

int hh = 0, tt = -1;

for (int i = 0; i < 26; ++i)

if (tr[0][i])

q[++tt] = tr[0][i];

while (hh <= tt) {

int t = q[hh++];

for (int i = 0; i < 26; ++i) {

int p = tr[t][i];

if (!p) tr[t][i] = tr[ne[t]][i];

else {

ne[p] = tr[ne[t]][i];

q[++tt] = p;

}

}

}

}

int main() {

int T;

scanf("%d", &T);

while (T--) {

memset(tr, 0, sizeof(tr));

memset(cnt, 0, sizeof(cnt));

memset(ne, 0, sizeof(ne));

idx = 0;

scanf("%d", &n);

for (int i = 0; i < n; ++i) {

scanf("%s", str);

insert();

}

build();

scanf("%s", str);

int res = 0;

for (int i = 0, j = 0; str[i]; ++i) {

int t = str[i] - 'a';

j = tr[j][t];

int p = j;

while (p) {

res += cnt[p];

cnt[p] = 0;

p = ne[p];

}

}

printf("%d\n", res);

}

return 0;

}

声明:以上文章均为用户自行发布,仅供打字交流使用,不代表本站观点,本站不承担任何法律责任,特此声明!如果有侵犯到您的权利,请及时联系我们删除。