KMP+差分 文章过滤器 (filter)
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)的更多相关文章
- ASP.NET没有魔法——ASP.NET MVC 过滤器(Filter)
上一篇文章介绍了使用Authorize特性实现了ASP.NET MVC中针对Controller或者Action的授权功能,实际上这个特性是MVC功能的一部分,被称为过滤器(Filter),它是一种面 ...
- SpringBoot系列教程web篇之过滤器Filter使用指南扩展篇
前面一篇博文介绍了在 SpringBoot 中使用 Filter 的两种使用方式,这里介绍另外一种直接将 Filter 当做 Spring 的 Bean 来使用的方式,并且在这种使用方式下,Filte ...
- SpringBoot系列教程web篇之过滤器Filter使用指南
web三大组件之一Filter,可以说是很多小伙伴学习java web时最早接触的知识点了,然而学得早不代表就用得多.基本上,如果不是让你从0到1写一个web应用(或者说即便从0到1写一个web应用) ...
- springCloud学习05之api网关服务zuul过滤器filter
前面学习了zuul的反向代理.负载均衡.fallback回退.这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil ...
- Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
在我们日常的开发中,我们经常会用到Filter和Interceptor.有时同一个功能.Filter可以做,Interceptor也可以做.有时就需要考虑使用哪一个比较好.这篇文章主要介绍一下,二者的 ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
- 网站过滤器Filter
实际上,Filter与Servlet及其相似,区别只是FIlter的doFilter()方法里多了一个FilterChain的参数,通过该参数可以控制是否放行用户的请求.网站有了过滤器十分的方便,可以 ...
- paip.输出内容替换在Apache 过滤器filter的设置
paip.输出内容替换在Apache 过滤器filter的设置 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
随机推荐
- BZOJ3456 城市规划 【多项式求逆】
题目链接 BZOJ3456 题解 之前我们用分治\(ntt\)在\(O(nlog^2n)\)的复杂度下做了这题,今天我们使用多项式求逆 设\(f_n\)表示\(n\)个点带标号无向连通图数 设\(g_ ...
- [NOI2010]能量采集 解题报告
[NOI2010]能量采集 题目描述 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. ...
- 【BZOJ 4034】[HAOI2015]树上操作 差分+dfs序+树状数组
我们只要看出来这道题 数组表示的含义就是 某个点到根节点路径权值和就行 那么我们可以把最终答案 看做 k*x+b x就是其深度 ,我们发现dfs序之后,修改一个点是差分一个区间,修改一个点的子树,可以 ...
- vue中使用 echarts3.0 或 echarts2.0 (模拟迁徙图,折线图)
一.echarts3.0(官网: http://echarts.baidu.com/) 首先通过npm安装echarts依赖,安装的为3.0版本 npm install echarts -s 也可以使 ...
- JavaScript渐变效果的实现
鼠标移上去透明度渐渐增加,鼠标移出,透明度渐渐减小. 关键代码: view source print? 1 var speed = 0; 2 if(target>obj.alpha){ 3 ...
- iOS 快速框架搭建项目
项目目录 Pod第三方 gitHub地址 https://github.com/henusjj/Basic-project-framework
- 图片和base64编码字符串 互相转换,图片和byte数组互相转换
图片和base64编码字符串 互相转换 import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.*; ...
- Hibernate 三种状态变化 与 sql 语句的关系
前言:在Hibernate中有三种状态,对它的深入理解,才能更好的理解hibernate的运行机理,刚开始不太注意这些概念,后来发现它是重要的.对于理解hibernate,JVM和sql的关系有更好的 ...
- struts2学习笔记(三)
一. Struts2 的验证 1). 验证分为两种: > 声明式验证* >> 对哪个 Action 或 Model 的那个字段进行验证 >> 使用什么验证规则 >& ...
- [洛谷P1040] 加分二叉树
洛谷题目链接:加分二叉树 题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di ...