2016 ACM/ICPC Asia Regional Qingdao Online 1003(AC自动机)
来源:互联网 发布:航拍测绘软件 编辑:程序博客网 时间:2024/05/16 07:12
Family View
题意:给出一系列的敏感词,如果下面文本以敏感词作为子串,那么输出'*'。
代码:
#include <bits/stdc++.h>using namespace std;const int MAXN = 1000000+100;char str[MAXN];int pos[MAXN];struct Aho_Corasick{ const static int maxnode = 1000000+100; const static int type = 26; int next[maxnode][type],fail[maxnode],end[maxnode],Len[maxnode]; int root,L; int newnode() { for(int i = 0;i<type;i++) next[L][i] = -1; Len[L]=0; end[L++] = -1; return L-1; } void init() { L = 0; root = newnode(); } void insert(char* str) { int len = strlen(str); int now = root; for(int i = 0;i < len;i++) { int id=str[i]-'a'; if(next[now][id] == -1) next[now][id] = newnode(); now=next[now][id]; } end[now]=1;//标志结束 Len[now]=len;//记录长度 } void build() { queue<int>Q; fail[root] = root; for(int i = 0;i < type;i++) if(next[root][i] == -1) next[root][i] = root; else { fail[next[root][i]] = root; Q.push(next[root][i]); } while(!Q.empty()) { int now = Q.front(); Q.pop(); for(int i = 0;i < type;i++) if(next[now][i] == -1) next[now][i] = next[fail[now]][i]; else { fail[next[now][i]] = next[fail[now]][i]; Q.push(next[now][i]); } } } void work(char* str) { int id; int len = strlen(str); int now = root; memset(pos,0,sizeof(pos)); for(int i = 0;i < len;i++) { if(str[i]>='A'&&str[i]<='Z') id=str[i]-'A'; else if(str[i]>='a'&&str[i]<='z') id=str[i]-'a'; else continue; now = next[now][id]; int temp=now; while(temp != root) { if(end[temp] == 1) { pos[i+1]-=1; pos[i-Len[temp]+1]+=1; break; } temp = fail[temp]; } } long long cnt=0; for(int i=0;i<len;i++) { cnt+=pos[i]; if(cnt<=0) printf("%c",str[i]); else printf("*"); } printf("\n"); }}AC;int main(){ int T; int n; scanf("%d",&T); while(T--) { AC.init(); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",str); AC.insert(str); } AC.build(); getchar(); gets(str); AC.work(str); } return 0;}
阅读全文
0 0
- 2016 ACM/ICPC Asia Regional Qingdao Online 1003(AC自动机)
- 【2016 ACM/ICPC Asia Regional Qingdao Online】
- 2016 ACM/ICPC Asia Regional Qingdao Online
- 2016 ACM/ICPC Asia Regional Qingdao Online
- HDU6208 The Dominator of Strings AC自动机 [2017 ACM/ICPC Asia Regional Qingdao Online]
- 2016 ACM/ICPC Asia Regional Qingdao Online(8题)
- 2016 ACM/ICPC Asia Regional Qingdao Online(Cure)
- 2016 ACM/ICPC Asia Regional Qingdao Online(Balanced Game)
- 2017 ACM/ICPC Asia Regional Qingdao Online
- 2017 ACM/ICPC Asia Regional Qingdao Online
- 2017 ACM/ICPC Asia Regional Qingdao Online
- 2017 ACM/ICPC Asia Regional Qingdao Online
- 2016 ACM/ICPC Asia Regional Qingdao Online 1002Cure
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001
- 2016 ACM/ICPC Asia Regional Qingdao Online 1005
- HDU 5879 Cure 2016 ACM/ICPC Asia Regional Qingdao Online
- HDU 5884 Sort 2016 ACM/ICPC Asia Regional Qingdao Online
- HDU5878 Cure 2016 ACM/ICPC Asia Regional Qingdao Online
- PowerDesigner连接MySQL,建立逆向工程图解
- 查看缩略图dome.html
- Faster RCNN 源码解读(3.1) -- RPN源码结构介绍
- python爬取网页并作简单处理(python2.7.1) 一
- bzoj1818: [Cqoi2010]内部白点
- 2016 ACM/ICPC Asia Regional Qingdao Online 1003(AC自动机)
- JVM_0_序
- stat函数
- 生命之树
- 传道书节选
- NOIP集训Week 1总结
- Java编程案例之学生管理系统
- 初识Html
- 51nod 1524 可除图的最大团(DP)