HDU 3065 病毒侵袭持续中 AC自动机
2014-09-15 16:48
344 查看
题意:找出模式串在文本串中出线的次数。
解题思路:裸AC自动机
解题代码:
View Code
解题思路:裸AC自动机
解题代码:
// File Name: temp.cpp // Author: darkdream // Created Time: 2014年09月11日 星期四 15时18分26秒 #include<vector> #include<list> #include<map> #include<set> #include<deque> #include<stack> #include<bitset> #include<algorithm> #include<functional> #include<numeric> #include<utility> #include<sstream> #include<iostream> #include<iomanip> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> #include<queue> #define LL long long #define maxn 1010*50 using namespace std; int hs[1010]; struct Trie { int next[maxn][26],fail[maxn],end[maxn]; int root, L; int newnode() { for(int i = 0 ;i < 26;i ++) next[L][i] = -1; end[L++] = 0 ; return L-1; } void init() { L = 0 ; root = newnode(); } void insert(char buf[],int K) { int len = strlen(buf); int now = root; for(int i = 0 ;i < len ;i ++) { int tt = buf[i] - 'A'; if(next[now][tt] == -1) { next[now][tt] = newnode(); } now = next[now][tt]; } end[now] = K; } void build() { queue<int> Q; fail[root] = root; for(int i = 0;i < 26;i ++) { if(next[root][i] == -1) { next[root][i] = root; //指向root 是没有问题的,我们主要是通过end 数组对个数进行计数的。 }else{ fail[next[root][i]] = root; Q.push(next[root][i]); } } while(!Q.empty()) { int now = Q.front(); Q.pop(); for(int i = 0 ;i < 26;i ++) { if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; else{ fail[next[now][i]] = next[fail[now]][i]; Q.push(next[now][i]); } } } } void query(char buf[]) { int now = root ; int len = strlen(buf); for(int i = 0 ;i <= len;i ++) { if(!(buf[i] <= 'Z' && buf[i] >= 'A')) { now = root ; continue; } now = next[now][buf[i] - 'A']; int temp = now ; while(temp != root) { if(end[temp]) { hs[end[temp]] ++ ; } temp = fail[temp]; } } } }; char str[1005][100]; char buf[2100010]; Trie ac; int main(){ int n; while(scanf("%d",&n) != EOF) { ac.init(); for(int i = 1 ;i <= n;i ++) { scanf("%s",str[i]); ac.insert(str[i],i); } ac.build(); memset(hs,0,sizeof(hs)); scanf("%s",buf); ac.query(buf); for(int i = 1;i <= n;i ++) { if(hs[i]) { printf("%s: %d\n",str[i],hs[i]); } } } return 0; }
View Code
相关文章推荐
- 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自动机题解
- AC自动机 病毒侵袭持续中 HDU - 3065
- 病毒侵袭持续中 - HDU 3065(AC自动机,判断子串个数)
- HDU 3065 病毒侵袭持续中 AC自动机
- AC自动机 病毒侵袭持续中 HDU - 3065
- [hdu 3065] 病毒侵袭持续中 [AC自动机] [病毒特征码匹配]
- hdu 3065 病毒侵袭持续中 ac自动机
- AC自动机 病毒侵袭持续中 HDU - 3065
- hdu 3065 病毒侵袭持续中 ac自动机
- AC自动机 病毒侵袭持续中 HDU - 3065
- AC自动机 病毒侵袭持续中 HDU - 3065