Description

给定一些短串,要求你在一个长串中,将这些短串部分变为\(*\)

Input

第一行包括一个整数\(n\),表示短串的数量.

接下来的\(n\)行,为\(n\)个短串.

最后一行,为你需要变化的长串.

Output

一行,表示变化后的长串.

PS:长串会有中有各种字符,短串仅包含英文字符

样例输入

3

int

ing

kitty

Int is interesting! ~OwO~

样例输出

\(***\) is \(***\)erest\(***\)ing! ~OwO~

上面的一些输入输出中为全角,实际上为半角.

这题做法有很多啊,可以哈希,可以AC自动机,可以KMP.

这里讲一下KMP算法.

做法为\(KMP+\)差分.

首先需要将长串中的字母全部转为小写(大写).

\(isalpha\)吼啊

我们对每一个短串求出其\(next\)数组.再枚举这些串去和长串匹配.

但是一些位置会出问题.

比如

给定两个短串为\(GRE\)和\(eat\),长串为\(Great\)

则我们的长串要变成\(*****\)

因此引入了差分.

如果匹配上之后,我们直接对其左端点和右端点\(+1\)差分。

最终枚举的话,直接判断有无标记,如果有,则将当前位置变为\(*\)

然后直接输出即可.

代码

#include<cstdio>
#include<cctype>
#include<cstring>
#define R register
using namespace std;
char sta[150008],stb[150008];
int pos[150008],k,n,len;
struct cod
{
int nex[55],len;
char s[55];
}str[55];
char st[55],c;
inline char ch(char s)
{
if(!isalpha(s))return s;
if(s<='Z' and s>='A')s=s-'A'+'a';
return s;
}
int main()
{
scanf("%d",&n);
for(R int i=1;i<=n;i++)
{
scanf("%s",st+1);
str[i].len=strlen(st+1);
for(R int j=1;j<=str[i].len;j++)
str[i].s[j]=ch(st[j]);
str[i].nex[1]=0;k=0;
for(R int j=2;j<=str[i].len;j++)
{
while(str[i].s[k+1]!=str[i].s[j] and k)k=str[i].nex[k];
if(str[i].s[k+1]==str[i].s[j])k++;
str[i].nex[j]=k;
}
}
getchar();
while(c!='\n')
{
c=getchar();
if(c=='\n')break;
sta[++len]=c;
stb[len]=ch(c);
}
for(R int i=1;i<=n;i++)
{
k=0;
for(R int j=1;j<=len;j++)
{
while(k and str[i].s[k+1]!=stb[j])k=str[i].nex[k];
if(str[i].s[k+1]==stb[j])k++;
if(k==str[i].len)
{
pos[j-str[i].len+1]++;
pos[j+1]--;
}
}
}
for(R int i=1;i<=len;i++)
{
pos[i]+=pos[i-1];
if(pos[i])sta[i]='*';
printf("%c",sta[i]);
}
}
/*
2
GRE
eat
Great Britain
***** Britain
*/

KMP+差分 文章过滤器 (filter)的更多相关文章

  1. ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)

    上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...

  2. SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇

    前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...

  3. SpringBoot系列教程web篇之过滤器Filter使用指南

    web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...

  4. springCloud学习05之api网关服务zuul过滤器filter

    前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil ...

  5. Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

    在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...

  6. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  7. 网站过滤器Filter

    实际上,Filter与Servlet及其相似,区别只是FIlter的doFilter()方法里多了一个FilterChain的参数,通过该参数可以控制是否放行用户的请求.网站有了过滤器十分的方便,可以 ...

  8. paip.输出内容替换在Apache 过滤器filter的设置

    paip.输出内容替换在Apache 过滤器filter的设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...

  9. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

随机推荐

  1. BZOJ3456 城市规划 【多项式求逆】

    题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...

  2. [NOI2010]能量采集 解题报告

    [NOI2010]能量采集 题目描述 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. ...

  3. 【BZOJ 4034】[HAOI2015]树上操作 差分+dfs序+树状数组

    我们只要看出来这道题 数组表示的含义就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以 ...

  4. vue中使用 echarts3.0 或 echarts2.0 (模拟迁徙图,折线图)

    一.echarts3.0(官网: http://echarts.baidu.com/) 首先通过npm安装echarts依赖,安装的为3.0版本 npm install echarts -s 也可以使 ...

  5. JavaScript渐变效果的实现

    鼠标移上去透明度渐渐增加,鼠标移出,透明度渐渐减小. 关键代码: view source   print? 1 var speed = 0; 2 if(target>obj.alpha){ 3 ...

  6. iOS 快速框架搭建项目

    项目目录 Pod第三方 gitHub地址 https://github.com/henusjj/Basic-project-framework

  7. 图片和base64编码字符串 互相转换,图片和byte数组互相转换

    图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ...

  8. Hibernate 三种状态变化 与 sql 语句的关系

    前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...

  9. struts2学习笔记(三)

    一. Struts2 的验证 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >> 使用什么验证规则 >& ...

  10. [洛谷P1040] 加分二叉树

    洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...