Smiling & Weeping

              ---- 我只为你一个人写过月亮

题目链接:P4824 [USACO15FEB] Censoring S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目思路:编码时,在正常的kmp中加入以下两条:

1.定义一个和S一样大的数组记录每个字符对应的j值,用于删除一个P后j回到P前面的值,还应该有一个记录该位字符是不是被删除过,以防以后回溯又重新计算

2.用一个栈记录删除P的后的结果。每一次移动i就把S[i]入栈,若kmp匹配到一个P,此时栈顶的几个字符就是P,把栈顶的P弹出,相当于删除这个P。最后栈中留下的就是S中删除了所有P的结果

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
2 // 注意不一定是ind-plen,因为这个地方可能被删除过
3 using namespace std;
4 int n , Next[2000100] , t[2000100];
5 bool ff[2000100];
6 char str[2000100] , pattern[2000100] , ans[2000100];
7 stack<char> st;
8 void getNext(char *p , int plen){
9 Next[0] = 0; Next[1] = 0;
10 for(int i = 1; i < plen; i++){
11 int j = Next[i];
12 while(j && p[i] != p[j])
13 j = Next[j];
14 if(p[i] == p[j]) Next[i+1] = j+1;
15 else Next[i+1] = 0;
16 }
17 }
18 void kmp(char *s , char *p){
19 int ind=0;
20 bool flag = true;
21 int slen = strlen(s) , plen = strlen(p);
22 getNext(p , plen);
23 int j = 0;
24 for(int i = 0; i < slen; i++){
25 st.push(s[i]);
26 if(s[i] != p[j]) flag = true;
27 while(j && s[i] != p[j]){
28 j = Next[j];
29 }
30 if(s[i] == p[j]) j++;
31 t[i] = j;
32 if(j == plen){
33 int cnt = 0 , inde = i;
34 while(cnt != plen){
35 if(!ff[inde]) ff[inde] = true , cnt++;
36 inde--;
37 }
38 if(flag) ind = i , flag = false;
39 int tem = plen , fff = ind-plen;
40 while(ff[fff]) fff--;
41 j = t[fff];
42 ind -= j;
43 while(tem--)
44 st.pop();
45 }
46 }
47 }
48 int main()
49 {
50 scanf("%s",str);
51 scanf("%s",pattern);
52 kmp(str , pattern);
53 int len=st.size();
54 while(!st.empty())
55 ans[--len] = st.top() , st.pop();
56 printf("%s",ans);
57 return 0;
58 }

不愿勾起相思,不敢出门看月。

偏偏月仅窗来,害我一夜相思。

文章到此结束我们下次再见(* ̄︶ ̄)

 

kmp的简单应用的更多相关文章

  1. KMP算法简单回顾

    前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...

  2. KMP 算法简单解释

    ​ 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 ​ 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...

  3. HDU 2087 剪花布条 (简单KMP或者暴力)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. POJ2406简单KMP

    题意:      给一个字符串,求最大的前缀循环周期,就是最小的循环节对应的最大的那个周期. 思路:      KMP的简单应用,求完next数组后有这样的应用:next[i] :是最大循环节的第几位 ...

  5. UVA5876 Writings on the Wall 扩展KMP

    扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...

  6. 算法起步之kmp算法

    [作者Idlear  博客:http://blog.csdn.net/idlear/article/details/19555905]            这估计是算法连载文章的最后几篇了,马上就要 ...

  7. KMP算法 Next数组详解

    题面 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百 ...

  8. KMP算法-->深入浅出

    说明: 在网上查了各种资料,终于对KMP算法有了透彻的了解,都说KMP特简单,我咋没有察觉呢?难道是智商不在线?或许都是骗纸? 还是进入正题吧,整理整理大佬的blog KMP算法简介: KMP算法是一 ...

  9. 串的应用与kmp算法讲解--学习笔记

    串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...

  10. 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解

    一.前言   在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...

随机推荐

  1. RabbitMQ系列-Exchange介绍

    RabbitMQ系列 RabbitMQ系列-概念及安装 1. Exchange RabbitMQ系列-概念及安装提到AMQP 0-9-1协议默认支持四种exchange,分别是Direct Excha ...

  2. 终极指南!Terraform的进阶技巧

    如果您已经对 Terraform 了如指掌,并期望自己的 IaC 技能有进一步提升的话,这篇文章很适合您!在本文中,我们将分享一些 Terraform 的高级使用技巧.从使用模块(module).工作 ...

  3. RWKV – transformer 与 RNN 的强强联合

    在 NLP (Natural Language Processing, 自然语言处理) 领域,ChatGPT 和其他的聊天机器人应用引起了极大的关注.每个社区为构建自己的应用,也都在持续地寻求强大.可 ...

  4. #PowerBi Superchange PowerBi 序言部分笔记(2)

    Xmind本文思维导图 序言部分,主要讲述了BI的分类及发展,以及作者推荐的学习方法.重点是介绍了powerbi的主要四大步骤. 即: 一:数据采集 Data acquisition: Power B ...

  5. 1. Spring相关概念

    1. 初始 Spring ‍ 1.1 Spring 家族 ‍ 官网:​https://spring.io,从官网我们可以大概了解到: Spring 能做什么:用以开发 web.微服务以及分布式系统等, ...

  6. JWT解析详解

    JWT解析详解:> https://www.fke6.com/html/77107.html

  7. 国标GB28181协议客户端开发(三)查询和实时视频画面

    国标GB28181协议客户端开发(三)查询和实时视频画面 本文是<国标GB28181协议设备端开发>系列的第三篇,探讨了信息查询和实时视频在GB28181协议中的应用.首先,介绍了设备目录 ...

  8. ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)花式用法

    同源策略是所有浏览器都必须遵循的一项安全原则,它的存在决定了浏览器在默认情况下无法对跨域请求的资源做进一步处理.为了实现跨域资源的共享,W3C制定了CORS规范.ASP.NET利用CorsMiddle ...

  9. EDP转LVDS屏转接板方案芯片CS5211替代CH7511B电路设计

    CS5211替代CH7511B电路设计: CS5211用于设计DP转LVDS转换器,DP转LVDS控制板,DP转LVDS转接板等产品设计,其性能和参数可以替代与兼容PS8622,PS8625,CH75 ...

  10. 谷歌语法的基础知识&FOFA

    谷歌语法 谷歌语法基础符号: "xxx":表示完全匹配,即关键字不能分开,顺序也不能变 +:"xxx"+www.baidu.com  搜索xxx与baidu.c ...