AC自己主动机
AC自己主动机
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- #define INF (1<<30)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define rep(i, n) for (int i = 0; i < n; i++)
- #define debug puts("===============")
- typedef long long ll;
- using namespace std;
- const int maxnode = 500100;
- const int charset = 26;
- struct ACAutomaton {
- int ch[maxnode][charset];
- int fail[maxnode];
- int Q[maxnode];
- int val[maxnode];
- int sz;
- int ID[128];
- //初始化,计算字母相应的儿子ID,如:'a'->0 ... 'z'->25
- void init() {
- fail[0] = 0;
- for (int i = 0; i < charset; i++) ID[i + 'a'] = i;
- }
- //又一次建树需先Reset
- void reset() {
- memset(ch[0], 0, sizeof(ch[0]));
- sz = 1;
- }
- //将权值为key的字符串a插入到trie中
- void Insert(char *s, int key) {
- int u = 0;
- for ( ; *s; s++) {
- int c = ID[*s];
- if (!ch[u][c]) {
- memset(ch[sz], 0, sizeof(ch[sz]));
- val[sz] = 0;
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- val[u] += key;
- }
- //建立AC自己主动机,确定每一个节点的权值以及状态转移
- void Construct () {
- int *s = Q, *e = Q;
- for (int i = 0; i < charset; i++) {
- if (ch[0][i]) {
- fail[ch[0][i]] = 0;
- *e ++ = ch[0][i];
- }
- }
- while(s != e) {
- int u = *s++;
- for (int i = 0; i < charset; i++) {
- int &v = ch[u][i];
- if (ch[u][i]) {
- *e ++ = v;
- fail[v] = ch[fail[u]][i];
- } else {
- v = ch[fail[u]][i];
- }
- }
- }
- }
- //最基础的查询,询问一个字符串中出现了多少模板串
- int query(char *s) {
- int ans = 0, u = 0;
- for ( ; *s; s++) {
- int c = ID[*s];
- u = ch[u][c];
- int tmp = u;
- while(tmp) {
- ans += val[tmp];
- val[tmp] = 0;
- tmp = fail[tmp];
- }
- }
- return ans;
- }
- }AC;
- char str[1000100];
- int main() {
- AC.init();
- int t, n;
- scanf("%d", &t);
- while(t--) {
- scanf("%d", &n);
- AC.reset();
- for (int i = 0; i < n; i++) {
- scanf("%s", str);
- AC.Insert(str, 1);
- }
- AC.Construct();
- scanf("%s", str);
- printf("%d\n", AC.query(str));
- }
- return 0;
- }
HDU 2896 病毒侵袭
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- #define INF (1<<30)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define rep(i, n) for (int i = 0; i < n; i++)
- #define debug puts("===============")
- typedef long long ll;
- using namespace std;
- const int maxnode = 100100;
- const int charset = 128;
- struct ACAutomaton {
- int ch[maxnode][charset];
- int fail[maxnode];
- int Q[maxnode];
- int val[maxnode];
- int sz;
- int ID[128];
- void init() {
- fail[0] = 0;
- for (int i = 0; i < charset; i++) ID[i] = i;
- }
- void reset() {
- sz = 1;
- memset(ch[0], 0, sizeof(ch[0]));
- }
- void Insert(char *s, int key) {
- int u = 0;
- for ( ; *s; s++) {
- int c = ID[*s];
- if (!ch[u][c]) {
- memset(ch[sz], 0, sizeof(ch[sz]));
- val[sz] = 0;
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- val[u] = key;
- }
- void Construct () {
- int *s = Q, *e = Q;
- for (int i = 0; i < charset; i++) {
- if (ch[0][i]) {
- *e++ = ch[0][i];
- fail[ch[0][i]] = 0;
- }
- }
- while(s != e) {
- int u = *s++;
- for (int i = 0; i < charset; i++) {
- int &v = ch[u][i];
- if (v) {
- *e++ = v;
- fail[v] = ch[fail[u]][i];
- } else {
- v = ch[fail[u]][i];
- }
- }
- }
- }
- void query(char *s, int &tot, int id) {
- int ans = 0, u = 0;
- set<int> S;
- set<int>::iterator it;
- S.clear();
- for (; *s; s++) {
- int c = ID[*s];
- u = ch[u][c];
- int tmp = u;
- while(tmp) {
- if (val[tmp]) S.insert(val[tmp]), ans++;
- tmp = fail[tmp];
- }
- }
- if (ans) {
- printf("web %d:", id);
- for (it = S.begin(); it != S.end(); it++) printf(" %d", *it);
- putchar('\n');
- tot++;
- }
- }
- }AC;
- char buf[210], str[10100];
- int main () {
- int n, m, tot = 0;
- scanf("%d", &n);
- AC.init();
- AC.reset();
- for (int i = 0; i < n; i++) {
- scanf("%s", buf);
- AC.Insert(buf, i + 1);
- }
- AC.Construct();
- scanf("%d", &m);
- for (int i = 0; i < m; i++) {
- scanf("%s", str);
- AC.query(str, tot, i + 1);
- }
- printf("total: %d\n", tot);
- return 0;
- }
HDU 3065 病毒侵袭持续中
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- #define INF (1<<30)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define rep(i, n) for (int i = 0; i < n; i++)
- #define debug puts("===============")
- typedef long long ll;
- using namespace std;
- const int maxnode = 50010;
- const int charset = 128;
- int cnt[1100];
- struct ACAutomaton {
- int ch[maxnode][charset];
- int fail[maxnode];
- int Q[maxnode];
- int val[maxnode];
- int sz;
- int ID[128];
- void init() {
- fail[0] = 0;
- for (int i = 0; i < charset; i++) ID[i] = i;
- }
- void reset() {
- sz = 1;
- memset(ch[0], 0, sizeof(ch[0]));
- }
- void Insert(char *s, int key) {
- int u = 0;
- for ( ; *s; s++) {
- int c = ID[*s];
- if (!ch[u][c]) {
- memset(ch[sz], 0, sizeof(ch[sz]));
- val[sz] = 0;
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- val[u] = key;
- }
- void Construct () {
- int *s = Q, *e = Q;
- for (int i = 0; i < charset; i++) {
- if (ch[0][i]) {
- *e++ = ch[0][i];
- fail[ch[0][i]] = 0;
- }
- }
- while(s != e) {
- int u = *s++;
- for (int i = 0; i < charset; i++) {
- int &v = ch[u][i];
- if (v) {
- *e++ = v;
- fail[v] = ch[fail[u]][i];
- } else {
- v = ch[fail[u]][i];
- }
- }
- }
- }
- void query(char *s) {
- int u = 0;
- for (; *s; s++) {
- int c = ID[*s];
- u = ch[u][c];
- int tmp = u;
- while(tmp) {
- if (val[tmp]) cnt[val[tmp]]++;
- tmp = fail[tmp];
- }
- }
- }
- } AC;
- char buf[1100][55], str[2000100];
- int main () {
- int n, m, tot = 0;
- AC.init();
- while(~scanf("%d", &n)) {
- AC.reset();
- for (int i = 0; i < n; i++) {
- scanf("%s", buf[i]);
- AC.Insert(buf[i], i + 1);
- cnt[i + 1] = 0;
- }
- AC.Construct();
- scanf("%s", str);
- AC.query(str);
- for (int i = 1; i <= n; i++) if (cnt[i]) printf("%s: %d\n", buf[i - 1], cnt[i]);
- }
- return 0;
- }
ZOJ 3430 Detect the Virus
- /*
- ID: wuqi9395@126.com
- PROG:
- LANG: C++
- */
- #include<map>
- #include<set>
- #include<queue>
- #include<stack>
- #include<cmath>
- #include<cstdio>
- #include<vector>
- #include<string>
- #include<fstream>
- #include<cstring>
- #include<ctype.h>
- #include<iostream>
- #include<algorithm>
- #define INF (1<<30)
- #define PI acos(-1.0)
- #define mem(a, b) memset(a, b, sizeof(a))
- #define rep(i, n) for (int i = 0; i < n; i++)
- #define debug puts("===============")
- typedef long long ll;
- using namespace std;
- const int maxnode = 510 * 64;
- const int charset = 256;
- struct ACAutomaton {
- int ch[maxnode][charset];
- int fail[maxnode];
- int Q[maxnode];
- int val[maxnode];
- int sz;
- int ID[256];
- void init() {
- fail[0] = 0;
- //for (int i = 0; i < charset; i++) ID[i] = i;
- }
- void reset() {
- sz = 1;
- memset(ch[0], 0, sizeof(ch[0]));
- }
- void Insert(unsigned char s[], int key, int len) {
- int u = 0;
- for (int i = 0; i < len; i++) {
- int c = 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] = key;
- }
- void Construct () {
- int *s = Q, *e = Q;
- for (int i = 0; i < charset; i++) {
- if (ch[0][i]) {
- *e++ = ch[0][i];
- fail[ch[0][i]] = 0;
- }
- }
- while(s != e) {
- int u = *s++;
- for (int i = 0; i < charset; i++) {
- int &v = ch[u][i];
- if (v) {
- *e++ = v;
- fail[v] = ch[fail[u]][i];
- } else {
- v = ch[fail[u]][i];
- }
- }
- }
- }
- void query(unsigned char s[], int len) {
- int u = 0, ans = 0;
- bool vis[520] = {0};
- for (int i = 0; i < len; i++) {
- int c = s[i];
- u = ch[u][c];
- int tmp = u;
- while(tmp) {
- if (val[tmp] && !vis[val[tmp]]) {
- ans++, vis[val[tmp]] = 1;
- }
- tmp = fail[tmp];
- }
- }
- printf("%d\n", ans);
- }
- } AC;
- char s[4000];
- unsigned char g[4000];
- unsigned char now[4000];
- void get(char *s, int len) {
- for (int i = 0; i < len; i++) {
- if (s[i] >= 'A' && s[i] <= 'Z') g[i] = s[i] - 'A';
- else if (s[i] >= 'a' && s[i] <= 'z') g[i] = s[i] - 'a' + 26;
- else if (s[i] >= '0' && s[i] <= '9') g[i] = s[i] - '0' + 52;
- else if (s[i] == '+') g[i] = 62;
- else g[i] = 63;
- }
- g[len] = 0;
- }
- int change(unsigned char g[], int len) {
- int cnt = 0;
- for (int i = 0; i < len; i += 4) {
- now[cnt++] = (g[i] << 2) | (g[i + 1] >> 4);
- if (i + 2 < len) now[cnt++] = (g[i + 1] << 4) | (g[i + 2] >> 2);
- if (i + 3 < len) now[cnt++] = (g[i + 2] << 6) | g[i + 3];
- }
- return cnt;
- }
- int main () {
- int n, m;
- AC.init();
- while(~scanf("%d", &n)) {
- AC.reset();
- for (int i = 0; i < n; i++) {
- scanf("%s", s);
- int len = strlen(s);
- while(s[len - 1] == '=') len--;
- get(s, len);
- int cnt = change(g, len);
- AC.Insert(now, i + 1, cnt);
- }
- AC.Construct();
- scanf("%d", &m);
- while(m--) {
- scanf("%s", s);
- int len = strlen(s);
- while(s[len - 1] == '=') len--;
- get(s, len);
- int cnt = change(g, len);
- AC.query(now, cnt);
- }
- putchar('\n');
- }
- return 0;
- }
题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列。问随机构成的长度为n的序列中,有多少种序列是可行的(仅仅要包括一个不可行序列便不可行)。个数非常大,对100000取模。
持续更新中
AC自己主动机的更多相关文章
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- 【UVA】1449-Dominating Patterns(AC自己主动机)
AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...
- POJ 3691 & HDU 2457 DNA repair (AC自己主动机,DP)
http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
- NYOJ 1085 数单词 (AC自己主动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 为了可以顺利通过英语四六级考试,如今大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中能够通过六 ...
- hdu 4057 AC自己主动机+状态压缩dp
http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...
- Keywords Search (ac 自己主动机)
Keywords Search Problem Description In the modern time, Search engine came into the life of everybod ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...
随机推荐
- OCaml Language Sucks
OCaml Language Sucks OCaml Language Sucks
- ABP中动态WebAPI原理解析
ABP中动态WebAPI原理解析 动态WebAPI应该算是ABP中最Magic的功能之一了吧.开发人员无须定义继承自ApiController的类,只须重用Application Service中的类 ...
- wpf dll和exe合并成一个新的exe
原文:wpf dll和exe合并成一个新的exe 微软有一个工具叫ILMerge可以合并dll exe等,但是对于wpf的应用程序而言这个工具就不好用了.我的这方法也是从国外一个博客上找来的.仅供大家 ...
- 再读TCP/IP网络7层协议
随着工作的深入,每次读这7层协议,每次都有不同的理解. 分层名 分层号 ...
- poj3206(bfs+最小生成树)
传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...
- hdu2612(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612 题意:求2个点到任意一个KFC的距离之和,使其最小. 分析:由两个点出发分别两次bfs,求得到每 ...
- 你有PSD的学位吗? - dp的日志 - 网易博客
你有PSD的学位吗? - dp的日志 - 网易博客 你有PSD的学位吗? 2011-08-01 12:58:40| 分类: 感悟 | 标签:自我提升 |字号 大中小 订阅 去年, ...
- HDOJ 2736 Surprising Strings
Surprising Strings Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 约瑟夫问题--list模拟循环链表
约瑟夫问题 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 n个人想玩残酷的死亡游戏,游戏规则例如以下: n个人进行编号,分别 ...
- SurfaceView的一个小应用:开发示波器
SurfaceView与普通View还有一个重要区别:View的绘图必须在UI线程中进行,但SurfaceView不存在这个问题,因为它是由SurfaceHolder来完成的.所以对于View组件,如 ...