hdoj 3065

来源:互联网 发布:交易开拓者 编程 编辑:程序博客网 时间:2024/05/16 16:14

题目大意:统计一些大写字母不重复的单词在文本中出现的次数。

解题思路:AC自动机。。。水题。

注意重复出现的单词,比如AAA表示单词AA出现了2次

#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;const int kind = 26;const int maxn = 1001;const int maxs = 51;const int maxm = 2000010;struct record{int begin, num;record(){begin = -1;num = 0;}};struct node{node *fail;node *next[kind];bool isLeaf;int index;node(){index = -1;fail = NULL;isLeaf = false;memset(next, 0, sizeof(next));}};char str[maxn * maxs], text[maxm];record re[maxn];int n;int insert(node *root, char *str, int index);void build(node *root);void query(node *root, char *str);int main(){while(scanf("%d", &n) != EOF){int index = 0, len;node *root = new node();char *ss = str;for(int i = 0; i < n; i++){re[i].begin = index;re[i].num = 0;scanf("%s", ss);len = insert(root, ss, i);index += len;ss += len;}build(root);scanf("%s", text);query(root, text);for(int i = 0; i < n; i++){ss = str;if(re[i].num != 0)printf("%s: %d\n", ss + re[i].begin, re[i].num);}}return 0;}int insert(node *root, char *str, int index){node *p = root;int sindex = 0, le = 0;while(str[le] != '\0'){sindex = str[le] - 'A';if(p->next[sindex] == NULL)p->next[sindex] = new node();p = p->next[sindex];le++;}p->isLeaf = true;p->index = index;return le + 1;}void build(node *root){queue<node *> que;node *tmp, *p;que.push(root);while(!que.empty()){tmp = que.front();que.pop();for(int i = 0; i < kind; i++){if(tmp->next[i] != NULL){if(tmp == root)tmp->next[i]->fail = root;else{p = tmp->fail;while(p != NULL){if(p->next[i] != NULL){tmp->next[i]->fail = p->next[i];break;}p = p->fail;}if(p == NULL)tmp->next[i]->fail = root;}que.push(tmp->next[i]);}}}}void query(node *root, char *str){int i = 0, sindex;node *p = root, *tmp;while(str[i] != '\0'){if(str[i] >= 'A' && str[i] <= 'Z'){sindex = str[i] - 'A';while(p != NULL && p->next[sindex] == NULL)p = p->fail;if(p == NULL)p = root;elsep = p->next[sindex];tmp = p;while(tmp != NULL){if(tmp->isLeaf)re[tmp->index].num++;tmp = tmp->fail;}}elsep = root;i++;}}


原创粉丝点击