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的出现位置.此算法通过运用对这个词在不匹配时本身就包含足够的信息 ...
随机推荐
- Mac常用文件解压命令
tar 解压:tar xvf fileName.tar 压缩:tar cvf fileName.tar directoryName rar 1.安装rar 下载RAR https://www.rarl ...
- CodeQl lab learn
step-3 query a function named strlen import cpp from Function f where f.getName() = "strlen&quo ...
- logging 模块因权限问题写入日志失败
哈喽大家好,我是咸鱼 今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过 1.案例现象 今天上班的时候手机短信收到了 zabbix 告警 ...
- 从 pheatmap 无缝迁移至 ComplexHeatmap
pheatmap 是一个非常受欢迎的绘制热图的 R 包.ComplexHeatmap 包即是受之启发而来.你可以发现Heatmap()函数中很多参数都与pheatmap()相同.在 pheatmap ...
- 用R来分析洛杉矶犯罪
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 洛杉矶市(Los Angeles)或"爵士乐的诞生地(The Birthplace ...
- Eclipse的Console如何实现中文输出(Eclipse Display Chinese)
最近遇到Eclipse的Console中文输出乱码的问题,现象如下: 在网上找到一些方法,一般均不好用,直到找到"如何在Eclipse控制台中显示汉字",链接如下 https:// ...
- ndk std_thread 获取pid
本文链接 https://www.cnblogs.com/wanger-sjtu/p/16817532.html 最近在解决tvm绑核问题时,发现android下绑核只有sched_setaffini ...
- 前端分页组件简单好用列表分页page组件
快速实现 简单好用列表分页组件, 分页器组件,用于展示页码.请求数据等 ,包含翻页. 详情请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12 ...
- DataX入门教学
B站学习网址: https://www.bilibili.com/video/BV1H44y1x76X/?p=5&spm_id_from=pageDriver&vd_source=5f ...
- 学习websocket,原来这么简单
简单介绍 websocket WebSocket是一种在TCP连接上进行全双工通信的协议. WebSocket通信协议于2011年被IETF定为标准. 然后WebSocket API也被W3C定为标准 ...