题目链接  2016 青岛网络赛  Problem C

题意  给出一些敏感词,和一篇文章。现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示。

建立$AC$自动机,查询的时候沿着$fail$指针往下走,当匹配成功的时候更新$f[i]$

$f[i]$表示要屏蔽以第$i$个字母结尾的长度为$f[i]$的字符串。

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)    for (int i(a); i <= (b); ++i)
#define dec(i, a, b) for (int i(a); i >= (b); --i)
#define fi first
#define se second typedef long long LL; const int N = 1e6 + 10; int T, n;
int f[N];
char buf[N]; struct Trie{ int nxt[N][26], fail[N], end[N], len[N];
int root, tot;
int newnode(){
rep(i, 0, 25) nxt[tot][i] = -1;
len[tot] = end[tot] = 0; tot++;
return tot - 1;
} void init(){
tot = 0;
root = newnode();
} void ins(char buf[]){
int l = strlen(buf);
int now = root;
rep(i, 0, l - 1){
if (nxt[now][buf[i] - 'a'] == -1) nxt[now][buf[i] - 'a'] = newnode();
now = nxt[now][buf[i] - 'a'];
}
end[now]++;
len[now] = strlen(buf);
} void build(){
queue <int> q;
fail[root] = root;
rep(i, 0, 25){
if (~nxt[root][i]){
fail[nxt[root][i]] = root;
q.push(nxt[root][i]);
}
else nxt[root][i] = root;
} while (!q.empty()){
int now = q.front();
q.pop();
rep(i, 0, 25){
if (~nxt[now][i]){
fail[nxt[now][i]] = nxt[fail[now]][i];
q.push(nxt[now][i]);
}
else nxt[now][i] = nxt[fail[now]][i];
}
}
} void query(char buf[]){
int l = strlen(buf);
int now = root;
int res = 0;
rep(i, 0, l - 1){
int sign;
if (buf[i] >= 'A' && buf[i] <= 'Z') sign = buf[i] - 'A';
else if (buf[i] >= 'a' && buf[i] <= 'z') sign = buf[i] - 'a';
else{
now = root;
continue;
}
now = nxt[now][sign];
int temp = now;
while (temp != root){
f[i] = max(f[i], len[temp]);
temp = fail[temp];
}
}
}
} ac; int leng, num; int main(){ scanf("%d",&T);
while (T--){
scanf("%d",&n);
ac.init();
rep(i, 1, n){
scanf("%s", buf);
ac.ins(buf);
} ac.build(); getchar();
gets(buf);
memset(f, 0, sizeof f); ac.query(buf);
leng = strlen(buf);
num = 0; dec(i, leng - 1, 0){
num = max(num, f[i]);
if (num == 0) continue;
else buf[i] = '*', num--;
} puts(buf);
}
return 0;
}

  

HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)的更多相关文章

  1. HDU 5886 Tower Defence(2016青岛网络赛 I题,树的直径 + DP)

    题目链接  2016 Qingdao Online Problem I 题意  在一棵给定的树上删掉一条边,求剩下两棵树的树的直径中较长那的那个长度的期望,答案乘上$n-1$后输出. 先把原来那棵树的 ...

  2. HDU5880 Family View(2016青岛网络赛 AC自动机)

    题意:将匹配的串用'*'代替 tips: 1 注意内存的使用,据说g++中指针占8字节,c++4字节,所以用g++交会MLE 2 注意这种例子, 12abcdbcabc 故失败指针要一直往下走,否则会 ...

  3. HDU 4768 Flyer (2013长春网络赛1010题,二分)

    Flyer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  5. HDU - 5878 2016青岛网络赛 I Count Two Three(打表+二分)

    I Count Two Three 31.1% 1000ms 32768K   I will show you the most popular board game in the Shanghai ...

  6. HDU - 5887 2016青岛网络赛 Herbs Gathering(形似01背包的搜索)

    Herbs Gathering 10.76% 1000ms 32768K   Collecting one's own plants for use as herbal medicines is pe ...

  7. HDU 6215 2017Brute Force Sorting 青岛网络赛 队列加链表模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6215 题意:给你长度为n的数组,定义已经排列过的串为:相邻两项a[i],a[i+1],满足a[i]&l ...

  8. HDU5887 Herbs Gathering(2016青岛网络赛 搜索 剪枝)

    背包问题,由于数据大不容易dp,改为剪枝,先按性价比排序,若剩下的背包空间都以最高性价比选时不会比已找到的最优解更好时则剪枝,即 if(val + (LD)pk[d].val / (LD)pk[d]. ...

  9. 2016青岛网络赛 Barricade

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Proble ...

随机推荐

  1. python学习笔记十二:类的定义

    demo #!/usr/bin/python class Person: name = 'jim' age = 25 def say(self): print 'My name is ' + self ...

  2. loadrunner检查点设置失败,日志中SaveCount无法被正常统计出来

    在脚本正确的情况下的web_reg_find检查点检查失败,SaveCount无法被正常统计出来. 在检查项Text为中文的情况下, ******(我是被录制下来的代码) web_reg_find(& ...

  3. 带外键Mysql

    带外键的表格的查询 复制代码 //////////////////查询指定表外键约束 select a.name as 约束名, object_name(b.parent_object_id) as ...

  4. [转] mysql分区性能初探

    本文转自:http://www.cnblogs.com/acpp/archive/2010/08/09/1795464.html 一,      分区概念  分区允许根据指定的规则,跨文件系统分配单个 ...

  5. ASP.NET 抓取网页内容

    (转)ASP.NET 抓取网页内容 ASP.NET 抓取网页内容-文字 ASP.NET 中抓取网页内容是非常方便的,而其中更是解决了 ASP 中困扰我们的编码问题. 需要三个类:WebRequest. ...

  6. LINQ to Entities 不识别方法“System int string 转换的问题

    这个问题困扰了挺久,网上找了挺多方法 都太好使. 分几种情况. 1.如果查询结果 转换,那比较容易. var q = from c in db.Customers where c.Country == ...

  7. Axios & Interceptors & Serialization & CORS & cookie

    Axios https://github.com/axios/axios#config-defaults Global axios defaults axios.defaults.baseURL = ...

  8. MPS添加管理设备实例NS的过程

    MPS添加管理设备实例NS的过程 MPS添加实例NS设备节点: > show snmp community Done > > add snmp community public al ...

  9. GYM - 101147 B.Street

    题意: 大矩形代表市场,大矩形当中有很多小矩形样式的伞.这些小矩形都贴着大矩形的左边或者右边且互不相交.小矩形以外的地方都是阳光.求经过大矩形时在阳光下的最短时间. 题解: 最短路的做法.起点和终点与 ...

  10. [NOWCODER] myh的超级多项式

    题面 已知$f_i=(\sum_{j=1}^ka_j{v_j}^i )\bmod 1004535809$ 给定$v_1,v_2,\ldots,v_k,f_1,f_2,\ldots f_k$ 求$f_n ...