hdu 5384 Danganronpa(AC自动机)
来源:互联网 发布:二手进口电动工具淘宝 编辑:程序博客网 时间:2024/05/09 04:42
题意:
f(A,B)表示:B在A中作为子串出现的次数。
题目给出n个证据,m个子弹
Ai是证据,Bi是子弹,题目问:所有Bi对每个Ai造成的伤害是多少,即每个Bi在Ai中出现的次数总和。
解析:
记得当时多校比赛的时候,我不会AC自动机,用字典树水了一发,没想到过了,昨晚学习了一下AC自动机,再来做这题,发现简直就是AC自动机的水题。
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <string>#include <queue>using namespace std;const int MAXN = (int)1e5 + 10;const int maxnode = (int)1e5 + 10;const int sigma_size = 26;struct AC { int ch[maxnode][sigma_size]; int fail[maxnode]; int last[maxnode]; int val[maxnode]; int sz; int ans; void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } inline int idx(char c) { return c - 'a'; } void insert(char *s) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u]++; } int getFail() { queue<int> que; for(int c = 0; c < sigma_size; c++) { int u = ch[0][c]; if(u) { fail[u] = 0; que.push(u); last[u] = 0; } } while(!que.empty()) { int r = que.front(); que.pop(); for(int c = 0; c < sigma_size; c++) { int u = ch[r][c]; if(!u) continue; que.push(u); int v = fail[r]; while(v && !ch[v][c]) v = fail[v]; fail[u] = ch[v][c]; last[u] = val[fail[u]] ? fail[u] : last[fail[u]]; } } } int find(const char* tar) { int n = strlen(tar); int v = 0; ans = 0; for(int i = 0; i < n; i++) { int c = idx(tar[i]); while(v && !ch[v][c]) v = fail[v]; v = ch[v][c]; if(val[v]) print(v); else if(last[v]) print(last[v]); } return ans; } void print(int j) { while(j) { ans += val[j]; j = last[j]; } }} ac;string tar[MAXN];char key[MAXN];int n, m;int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &m); ac.clear(); for(int i = 0; i < n; i++) { cin >> tar[i]; } for(int i = 0; i < m; i++) { scanf("%s", key); ac.insert(key); } ac.getFail(); for(int i = 0; i < n; i++) { printf("%d\n", ac.find( tar[i].c_str() )); } } return 0;}
0 0
- 【HDU 5384】Danganronpa(AC自动机)
- HDU 5384 Danganronpa(AC自动机)
- HDU 5384 Danganronpa(AC自动机)
- hdu 5384 Danganronpa(AC自动机)
- hdu 5384 Danganronpa(AC自动机)
- HDU-5384Danganronpa(AC自动机模板)
- HDU 5384 Danganronpa【AC自动机】
- hdu 5384 Danganronpa (ac自动机)
- hdu 5384 Danganronpa AC自动机
- hdu 5384 Danganronpa (ac自动机)
- hdu 5384 Danganronpa(AC自动机)
- HDU 5384 Danganronpa AC自动机
- hdu-Danganronpa(AC自动机)
- HDU 5384 Danganronpa(AC自动机模式串重复)
- HDU 5384 Danganronpa (AC自动机模板题)
- hdu 5384 Danganronpa(AC自动机模板题)
- hdu 5384 Danganronpa (字典树/AC自动机)
- HDU 5384 Danganronpa 多个串的ac自动机
- WebGL原生API及绘图基础
- CentOS 6.6下的J2EE环境搭建(一)之JDK安装
- iOS 心得一 单元格的动画加载(非autolayout适配模式下)
- 抽象类和接口的区别是什么?在使用上是如何选择的?
- UITableView主要知识框架
- hdu 5384 Danganronpa(AC自动机)
- Orlace 数据库连接的那些事儿:客户端(一)
- 有关Linux 50个趣味名人名言
- java实现Telnet连接
- 读取application/binary 是什么类型的文件
- 在 Linux 中使用日志来排错
- Objective-C入门08:可变数组
- sql语句占用内存查询
- cocos2d-x中,多个精灵执行同样的动作