HDU 3065 病毒侵袭持续中(ac自动机)
来源:互联网 发布:监控windows资源 编辑:程序博客网 时间:2024/06/05 02:47
题意:
求多模式串中每个模式串出现的次数
分析:
开个id数组记录下就好啦
代码:
//// Created by TaoSama on 2015-11-27// 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 = 2e6 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;const int M = 1000 * 50 + 10, S = 128;int n, cnt[1005];char virus[1005][55], s[N];struct AcAutomata { int root, sz; int nxt[M][S], fail[M], id[M]; int newNode() { id[sz] = -1; memset(nxt[sz], -1, sizeof nxt[sz]); return sz++; } void init() { sz = 0; root = newNode(); } void insert(char *s, int x) { int n = strlen(s); int u = root; for(int i = 0; i < n; ++i) { int &v = nxt[u][s[i]]; if(v == -1) v = newNode(); u = v; } id[u] = x; } 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]; } } } void query(char *s) { memset(cnt, 0, sizeof cnt); int u = root; for(int i = 0; s[i]; ++i) { u = nxt[u][s[i]]; for(int v = u; v != root; v = fail[v]) if(~id[v]) ++cnt[id[v]]; } for(int i = 1; i <= n; ++i) if(cnt[i]) printf("%s: %d\n", virus[i], cnt[i]); }} 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); while(scanf("%d", &n) == 1) { ac.init(); for(int i = 1; i <= n; ++i) { scanf("%s", virus[i]); ac.insert(virus[i], i); } ac.build(); scanf("%s", s); ac.query(s); } return 0;}
0 0
- HDU 3065:病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机模板)
- hdu 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- [hdu 3065] 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 - 病毒侵袭持续中 (AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机模板)
- HDU 3065 病毒侵袭持续中 (AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机裸)
- HDU 3065 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(ac自动机)
- HDU 3065 病毒侵袭持续中(AC自动机)
- HDU 3065 病毒侵袭持续中(AC自动机)
- hdu 3065 病毒侵袭持续中(AC自动机)
- redis 数据库 3.0.5 源码安装
- SVN使用教程总结
- HDU 2896 病毒侵袭(ac自动机)
- android应用程序中获取view的位置
- Android:layer-list详解
- HDU 3065 病毒侵袭持续中(ac自动机)
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- html/jsp 引用百度地图极其部分功能
- Leetcode 第228题 Summary Ranges
- SSIS - 无法保存数据流工具,无法保存包
- 精简我们的apk的方法
- 前端css特殊属性
- Marklogic学习 由浅入深(2)—— 安装Marklogic Server
- Spring-ws提供SOAP服务的注意事项