KMP——字串清除
来源:互联网 发布:电脑网络上有个感叹号 编辑:程序博客网 时间:2024/06/03 12:58
Description
我们定义字符串A是字符串B的子串当且仅当我们能在B串中找到A串。现在给你一个字符串A,和另外一个字符串B,要你每次从B串中从左至右找第一个A串,并从B串中删除它,直到A串不为B串的子串,问你需要进行几次删除操作。
Input
输入文件共2行,第一行一个字符串A(长度小于256),第二行一个字符串B。
30%的数据是随机生成的;
50%的数据满足输入文件大小小于300KB;
100%的数据满足输入文件小于500KB,字符串A、B中只会出现英文字母。
Output
输出文件只有一个整数N。
Sample Input
abcabcabcabaabcbccc
Sample Output
5
Hint
样例说明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc
分析:
模拟一个栈,一旦栈顶的字符串和给出的相等,就出栈,ans++;
如何判断栈顶是否满足要求呢?当然是使用 KMP 算法的模型:
代码如下:
#include<iostream>#include<cstring>#include<cstdio>using namespace std;char s[505],ch,a[5000005];int len,f[505],match[5000005];void get_fail(){ //预处理回退表 ; int i,j=0;for(i=2;i<=len;i++){while(j>0&&s[i]!=s[j+1])j=f[j];if(s[i]==s[j+1])j++;f[i]=j;}} int main(){scanf("%s",s+1);len=strlen(s+1);get_fail();int i,j,ans;i=j=ans=0;while(scanf("%c",&ch)!=EOF){ //逐个字符读入; i++;a[i]=ch;j=match[i-1];while(j>0&&s[j+1]!=a[i])j=f[j]; // kmp if(s[j+1]==a[i])j++;match[i]=j;if(match[i]==len)ans++,i-=len; //如果匹配,pop }printf("%d",ans);}
1 0
- KMP——字串清除
- 【大渣】【KMP】字串清除
- KMP求最长连续重复字串——POJ 1961
- KMP+求字串位置
- kmp匹配字串
- KMP字符串匹配,字串
- 字串统计 kmp算法
- KMP查找字串算法
- 蓝桥杯—字串统计
- poj——2752Seek the Name, Seek the Fame(kmp专练 找出前后相同的字串)
- 字串查找算法-KMP算法
- 蓝桥杯——01字串
- 字串统计——蓝桥杯
- 蓝桥杯——字串统计
- 数据结构 字串的模式匹配 KMP算法
- 校赛——填充数字串
- 华为OJ——公共字串计算
- 华为OJ——公共字串计算
- 唯爱小粽子:Maven使用详解:Maven的概述(一)
- JSP - JSTL(JSP标准标签库)
- 在window server服务器配置redis
- Entity Framework 支持 DataTable
- YTKKeyValueStore用法
- KMP——字串清除
- 洛谷题解--陶陶摘苹果(升级)
- Django中如何使用django-celery完成异步任务 (2)
- GEEK学习笔记— —Linux文件及目录
- 数据库(1)
- 人工智能:从穿越时光的需求看人工智能的获益
- Socket粘包问题
- 常用资源整理
- iOS开发--cocoaPods使用详细说明(转载他人)