HDU 3065 病毒侵袭持续中 AC自动机
2015-04-22 00:03
295 查看
这题用的是AC自动机做的,没听说过的自己去百度看看,这题唯一要注意的就是最后输入的字符串当中会出现不是26个大写字母当中的字符。
/* time 156MS mem 7444K */ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> #define maxn 26 #define maxc 2000005 #define mem(a) memset(a, 0, sizeof(a)) using namespace std; int head, tail, ans[1005], res[1005]; char ch[1005][55], cha[maxc]; struct node { int v; int num; struct node *next[maxn]; struct node *fail; }; node *q[100000], *root; void buildinit(struct node *a) { int i; a->v = 0; a->num = 0; a->fail = NULL; for(i = 0;i < 26;i++) a->next[i] = NULL; return; } void build(char *word, struct node *root, int num) { int i = 0, len, a; struct node *tmp; tmp = root; len = strlen(word); for(i = 0;i < len;i++) { a = ch[num - 1][i] - 'A'; if(tmp->next[a] == NULL) { tmp->next[a] = (struct node*)malloc(sizeof(struct node)); buildinit(tmp->next[a]); if(i == (len - 1)) tmp->next[a]->v = 1, tmp->next[a]->num = num; tmp = tmp->next[a]; } else { if(i == (len - 1)) tmp->next[a]->v = 1, tmp->next[a]->num = num; tmp = tmp->next[a]; } } return; } void ac_machine_build(struct node *root) { int i; head = 0; tail = 1; q[head] = root; struct node *tmp, *p; while(head < tail) { tmp = q[head++]; head %= 100000; for(i = 0;i < 26;i++) { if(tmp->next[i]) { if(tmp == root) { tmp->next[i]->fail = root; } else { p = tmp->fail; while(p) { if(p->next[i]) { tmp->next[i]->fail = p->next[i]; break; } p = p->fail; } if(!p) tmp->next[i]->fail = root; } q[tail++] = tmp->next[i]; tail %= 100000; } } } return; } void que(struct node *root) { int len, a, i; len = strlen(cha); struct node *p; p = root; for(i = 0;i < len;i++) { a = cha[i] - 'A'; if((a < 0)||(a > 25)) { p = root; continue; } while(!p->next[a]&&p != root) p = p->fail; p = p->next[a]; if(!p) p = root; struct node *tmp = p; while(tmp != root) { if(tmp->v > 0) { if(!res[tmp->num]) ans[++ans[0]] = tmp->num; res[tmp->num]++; } tmp = tmp->fail; } } return; } void deal(struct node *q) { int i; if(q) { for(i = 0;i < 26;i++) { if(q->next[i]) deal(q->next[i]); } free(q); } return; } int main(int argc, char *argv[]) { int num, i, j; while(scanf("%d", &num) != EOF) { mem(ch); mem(ans); mem(res); root = (struct node*)malloc(sizeof(struct node)); buildinit(root); for(i = 0;i < num;i++) { scanf("%s", ch[i]); build(ch[i], root, i + 1); } ac_machine_build(root); mem(cha); scanf("%s", cha); que(root); sort(ans + 1, ans + 1 + ans[0]); for(i = 1;i <= ans[0];i++) { printf("%s: %d\n", ch[ans[i] - 1], res[ans[i]]); } deal(root); } return 0; }
相关文章推荐
- HDU 3065 病毒侵袭持续中 AC自动机
- hdu 3065 病毒侵袭持续中 AC自动机
- HDU 3065 病毒侵袭持续中 AC自动机
- AC自动机 病毒侵袭持续中 HDU - 3065
- 病毒侵袭持续中 - HDU 3065(AC自动机,判断子串个数)
- HDU 3065 病毒侵袭持续中 (AC自动机 + hdu有毒)
- [HDU 3065]病毒侵袭持续中[AC自动机][模板题]
- AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )
- 病毒侵袭持续中 - 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自动机