题目链接  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. 《Cracking the Coding Interview》——第12章:测试——题目5·

    2014-04-25 00:41 题目:怎么测试一支笔?(Pen?您老说的是钢笔?) 解法:这种简约而不简单的题目,实在是面试官最喜欢,面试者最头疼的类型了.面试官可以只花三秒,以一种灰常高贵冷艳的语 ...

  2. 【Gradient Boosted Decision Tree】林轩田机器学习技术

    GBDT之前实习的时候就听说应用很广,现在终于有机会系统的了解一下. 首先对比上节课讲的Random Forest模型,引出AdaBoost-DTree(D) AdaBoost-DTree可以类比Ad ...

  3. ffifdyop

    题目地址:http://www.shiyanbar.com/ctf/2036 后台登陆 上来看到这个界面,果断先看一波源代码. 看到是拼接字符串进行sql查询,就想到了注入了. 但是很不幸的是md5( ...

  4. Jmeter日期

    有的时候我们接口中会有需要传递日期的参数,这是jmeter工具中给我准备一个 日期函数_time,如下图所示: 取到的将会是年月日 对应的写法有 yyyy-MM-dd HH:mm:ss  ---年月日 ...

  5. Node rescue/unrescue相关代码流程图

  6. 操作App.config的类(转载)

    http://www.cnblogs.com/yaojiji/archive/2007/12/17/1003191.html 操作App.config的类 public class DoConfig  ...

  7. 搭建springmvc项目404,没扫描到包

    搭建简单项目完成之后,曾经出现过一个问题 跳转报了404,控制台忘了没留啊... 反正意思就是说我配置有问题,导致没有扫描到注释的类 <context:component-scan base-p ...

  8. oracle基础概念学习笔记

    数据库对象: 1.表:表是用来存放用户数据的对象,由行和列组成. 2.约束:保证数据完整性的规则,可以作用在耽搁字段或者多个字段组合上,用来约束这些字段上的数据必须符合作用于之上的规则. 3.视图:通 ...

  9. java链接数据库--Mysql

    /************************************************************************* > File Name: Mysql.jav ...

  10. BZOJ 1014 [JSOI2008]火星人prefix | Splay维护哈希值

    题目: 题解: #include<cstdio> #include<algorithm> #include<cstring> typedef long long l ...