LightOJ 1427 Substring Frequency (II)(AC自动机裸)
2015-09-06 19:38
316 查看
题目链接:http://lightoj.com/volume_showproblem.php?problem=1427
题意:给定n个模式串,一个文本串,求每个模式串在文本串中出现的次数。
思路:AC自动机裸题。
代码:
题意:给定n个模式串,一个文本串,求每个模式串在文本串中出现的次数。
思路:AC自动机裸题。
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <vector> #include <map> #include <queue> #include <stack> using namespace std; #define lson l, m, rt << 1 #define rson m + 1, r, rt << 1 | 1 #define ceil(x, y) (((x) + (y) - 1) / (y)) const int SIZE = 30; const int N = 3e5 + 10; const int M = 5e2 + 10; const int INF = 0x7f7f7f7f; const int MAX_WORD = 1e6 + 10; const double EPS = 1e-9; const int MOD = 2015; int sz; int ch [SIZE]; int f ; int val ; bool ed ; char txt[MAX_WORD]; char mod[M][M]; int newnode() { memset(ch[sz], 0, sizeof(ch[sz])); f[sz] = 0; val[sz] = 0; ed[sz] = false; return sz++; } void init() { sz = 0; newnode(); } void insert(char *s) { int u = 0; for (int i = 0; s[i]; i++) { int v = s[i] - 'a'; if (!ch[u][v]) ch[u][v] = newnode(); u = ch[u][v]; } ed[u] = true; } void getfail() { queue<int> q; for (int i = 0; i < SIZE; i++) if (ch[0][i]) q.push(ch[0][i]); while (!q.empty()) { int r = q.front(); q.pop(); for (int i = 0; i < SIZE; i++) { int v = ch[r][i]; if (v) { q.push(v); int u = f[r]; while (u && !ch[u][i]) u = f[u]; f[v] = ch[u][i]; } else ch[r][i] = ch[f[r]][i]; } } } void find(char *s) { getfail(); int u = 0; for (int i = 0; s[i]; i++) { int v = s[i] - 'a'; u = ch[u][v]; int t = u; while (t) { if (ed[t]) val[t]++; t = f[t]; } } } int main() { int t_case; scanf("%d", &t_case); for (int i_case = 1; i_case <= t_case; i_case++) { int n; scanf("%d%s", &n, txt); init(); for (int i = 0; i < n; i++) { scanf("%s", mod[i]); insert(mod[i]); } find(txt); printf("Case %d:\n", i_case); for (int i = 0; i < n; i++) { int u = 0; for (int j = 0; mod[i][j]; j++) u = ch[u][mod[i][j] - 'a']; printf("%d\n", val[u]); } } return 0; }
相关文章推荐
- UI课程02 UILabel,UITextField,UIButton
- iOS——UISegmentedControl 的用法
- UML建模之时序图(Sequence Diagram)
- 一起了解一下 UITextView 的使用
- 使用Autolayout实现UITableView的Cell动态布局和高度动态改变
- 菜鸟启航:UILabel基本操作
- Kbuild文件
- UICollectionView
- SpannableString与SpannableStringBuilder
- JPQL查询语句(Java Presistence Query Language)(转)
- 使用sql生成UUID
- iOS音频播放 (五):AudioQueue
- UE4 编译虚幻引擎
- hibernate中HQL查询count返回query取得其长度
- Arduino ULN2009驱动步进电机
- Java中的StringBuilder类功能详解
- java.lang.IllegalArgumentException: the bind value at index 1 is null or java.lang.IllegalArgumen
- UE4在VS2013中各个编译配置代表意义
- 全面解释java中StringBuilder、StringBuffer、String类之间的关系
- ios UIAlertView