kmp的简单应用
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的简单应用的更多相关文章
- KMP算法简单回顾
前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...
- KMP 算法简单解释
讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...
- HDU 2087 剪花布条 (简单KMP或者暴力)
剪花布条 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- POJ2406简单KMP
题意: 给一个字符串,求最大的前缀循环周期,就是最小的循环节对应的最大的那个周期. 思路: KMP的简单应用,求完next数组后有这样的应用:next[i] :是最大循环节的第几位 ...
- UVA5876 Writings on the Wall 扩展KMP
扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...
- 算法起步之kmp算法
[作者Idlear 博客:http://blog.csdn.net/idlear/article/details/19555905] 这估计是算法连载文章的最后几篇了,马上就要 ...
- KMP算法 Next数组详解
题面 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百 ...
- KMP算法-->深入浅出
说明: 在网上查了各种资料,终于对KMP算法有了透彻的了解,都说KMP特简单,我咋没有察觉呢?难道是智商不在线?或许都是骗纸? 还是进入正题吧,整理整理大佬的blog KMP算法简介: KMP算法是一 ...
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 字符串匹配算法--KMP字符串搜索(Knuth–Morris–Pratt string-searching)C语言实现与讲解
一.前言 在计算机科学中,Knuth-Morris-Pratt字符串查找算法(简称为KMP算法)可在一个主文本字符串S内查找一个词W的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...
随机推荐
- docker 部署 springboot项目和直接运行 jar 文件详细步骤
目前docker发布springboot有两种方式,一种是制作镜像,另一种是直接运行jar 文件 第一种使用镜像来部署 一.创建项目目录 [root@dex ~]# mkdir /opt/backst ...
- nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50
最近在nginx中配置一个443端口 一.安装nginx 首先得先安装个nginx 1.安装依赖包 # 一键安装上面四个依赖 [root@dex ~]# yum -y install gcc zlib ...
- JAVA 使用IText7 + Freemarker 动态数据生成PDF实现案例
技术方案:IText7 + Freemarker 技术文档 Itext 官网:https://itextpdf.com/ itext API文档:https://api.itextpdf.com/iT ...
- .Net8罕见的技术:MSIL的机器码简析
前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...
- Supervisor启动并管理Celery相关进程
Supervisor启动并管理Celery相关进程 关于celery在运行过程中, 默认情况下是无法在关机以后自动重启的.所以我们一般开发中会使用supervisor进程监控来对celery程序进行运 ...
- 互动无极限:在线免费ChatGPT聊天工具-gpt4
在现代社会中,聊天交流已变得越来越普遍,并且不断发展成新的形式和类型.而如今,通过使用人工智能技术,我们可以更加便捷地进行自然的对话交流.那么,提供在线免费使用的ChatGPT聊天工具是否可以满足各种 ...
- idea设置退出软件提示
进入设置
- Educational Codeforces Round 150 (Rated for Div. 2) A-E
比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...
- 这问题巧了,SpringMVC 不同参数处理机制引发的思考
这个问题非常有趣,不是SpringMVC 的问题,是实际开发中混合使用了两种请求方式暴露出来的. 问题场景 功能模块中,提供两个 Http 服务.一个是列表查询(application/json 请求 ...
- selenium元素定位---ElementClickInterceptedException(元素点击交互异常)解决方法
1.异常原因 在编写ui自动化时,执行报错元素无法点击:ElementClickInterceptedException 具体报错:selenium.common.exceptions.Element ...