HDU 2222Keywords Search (ac自动机)
来源:互联网 发布:php判断变量是否设置 编辑:程序博客网 时间:2024/04/30 08:12
题意:
多模式串匹配母串,求模式串的出现次数
代码:
//// Created by TaoSama on 2015-10-31// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;const int M = 5e5 + 10;const int S = 26;int n;char s[N];struct AcAutomata { int root, sz; int nxt[M][S], fail[M], cnt[M]; int newNode() { cnt[sz] = 0; memset(nxt[sz], -1, sizeof nxt[sz]); return sz++; } void init() { sz = 0; root = newNode(); } void insert(char *s) { int n = strlen(s); int u = root; for(int i = 0; i < n; ++i) { int &v = nxt[u][s[i] - 'a']; if(v == -1) v = newNode(); u = v; } ++cnt[u]; } void build() { queue<int> q; fail[root] = root; for(int i = 0; i < S; ++i) { int &v = nxt[root][i]; if(~v) { fail[v] = root; q.push(v); } else v = root; } while(q.size()) { int u = q.front(); q.pop(); for(int i = 0; i < S; ++i) { int &v = nxt[u][i]; if(~v) { fail[v] = nxt[fail[u]][i]; q.push(v); } else v = nxt[fail[u]][i]; } } } int query(char *s) { int n = strlen(s); int u = root, ret = 0; for(int i = 0; i < n; ++i) { u = nxt[u][s[i] - 'a']; for(int v = u; v != root; v = fail[v]) { ret += cnt[v]; cnt[v] = 0; } } return ret; }} ac;int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); while(t--) { scanf("%d", &n); ac.init(); for(int i = 1; i <= n; ++i) { scanf("%s", s); ac.insert(s); } ac.build(); scanf("%s", s); printf("%d\n", ac.query(s)); } return 0;}
0 0
- hdU 2222 Keywords Search(AC自动机)
- hdu 2222 Keywords Search(AC自动机)
- hdu 2222 Keywords Search(AC自动机)
- HDU 2222 Keywords Search (AC自动机)
- hdu - 2222 - Keywords Search(AC自动机)
- hdu 2222 Keywords Search(AC自动机)
- hdu 2222 Keywords Search(AC 自动机)
- HDU 2222 - Keywords Search (AC自动机)
- HDU - 2222 Keywords Search (AC自动机)
- HDU - 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search(AC自动机)
- HDU 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search(AC自动机)
- hdu 2222 Keywords Search(AC自动机)
- HDU 2222 Keywords Search (AC自动机)
- HDU 2222Keywords Search (ac自动机)
- HDU 2222 Keywords Search(AC自动机)
- HDU-2222 Keywords Search(AC自动机)
- C++中的强制类型转换
- MINA心跳协议
- POJ 2085 JAVA
- 简单修改Linux系统文件描述符限制(Too many open files)
- jquery的has、find和filter函数的异同
- HDU 2222Keywords Search (ac自动机)
- ros的navigation之———gmapping应用详解(in ros)
- oracle case when then
- 细说KVO & KVC & NSNotificationCenter那些事
- P-CNN: Pose-based CNN Features for Action Recognition (CNN篇)
- JNI简介
- 右脑开发/开天眼/打通大周天/近视眼康复
- Django网站中文件下载的实现和网页部分打印的实现。
- PL/SQL Beautifier could not parse text