本文主要是介绍hdu 3065 ac自动机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
3 AA BB CC ooxxCC%dAAAoen....END
AA: 2
CC: 1
Hit: 题目描述中没有被提及的所有情况都应该进行考虑。比如两个病毒特征码可能有相互包含或者有重叠的特征码段。 计数策略也可一定程度上从Sample中推测。ac自动机裸题:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> using namespace std; int vis[1005]; char a[1005][60]; struct Trie {int next[210*500][128],fail[210*500],end[210*500];int root,L;int newnode(){for(int i = 0;i < 128;i++)next[L][i] = -1;end[L++] = -1;return L-1;}void init(){L = 0;root = newnode();}void insert(char s[],int id){int len = strlen(s);int now = root;for(int i = 0;i < len;i++){if(next[now][s[i]] == -1)next[now][s[i]] = newnode();now=next[now][s[i]];}end[now]=id;}void build(){queue<int>Q;fail[root] = root;for(int i = 0;i < 128;i++)if(next[root][i] == -1)next[root][i] = root;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 < 128;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]);}}}bool used[510];bool query(char buf[],int n){int len = strlen(buf);int now = root;memset(vis,0,sizeof(vis));bool flag = false;for(int i = 0;i < len;i++){now = next[now][buf[i]];int temp = now;while(temp != root){if(end[temp] != -1){//used[end[temp]] = true;//flag = true;vis[end[temp]]++;}temp = fail[temp];}}for(int i=1;i<=n;i++){if(vis[i])printf("%s: %d\n",a[i],vis[i]);}} }; char buf[2000005]; Trie ac; int main() {int n;while(scanf("%d",&n) != EOF){ac.init();for(int i = 1;i <= n;i++){scanf("%s",a[i]);ac.insert(a[i],i);}ac.build();scanf("%s",buf);ac.query(buf,n);}return 0; }
这篇关于hdu 3065 ac自动机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!