【大渣】【KMP】字串清除
2015-11-04 17:15
225 查看
子串清除
Time Limit:10000MS Memory Limit:65536K
Total Submit:115 Accepted:52
Case Time Limit:1000MS
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
Sample Output
Hint
样例说明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc
Source
KMP
==================================================================================
分析:
入读B串的时候每读一个字符用KMP判断一次A串是否为B串的子串,如果是就删掉,然后ans++,
不多说,给代码。
=============================================================
然后看了铺盖学长的题解发现用栈模拟效率也不低,就写了一个= =
栈模拟的代码:
NOIP还有2天才看KMP也是迷醉~
Time Limit:10000MS Memory Limit:65536K
Total Submit:115 Accepted:52
Case Time Limit:1000MS
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
abc abcabcabaabcbccc
Sample Output
5
Hint
样例说明:abcabcabaabcbccc-> abcabaabcbccc-> abaabcbccc-> ababccc-> abcc
Source
KMP
==================================================================================
分析:
入读B串的时候每读一个字符用KMP判断一次A串是否为B串的子串,如果是就删掉,然后ans++,
不多说,给代码。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char A[300],B[500001]; int F[300],G[500001]; int main() { int i,j,k,lenA,ans=0; scanf("%s",&A); lenA=strlen(A); j=F[0]=-1; for(i=1;i<lenA;i++) { while(j>-1&&A[j+1]!=A[i])j=F[j]; if(A[j+1]==A[i])j++; F[i]=j; } char tt; i=-1; tt=getchar(); while(1) { B[++i]=tt; if(i==0)j==-1; else j=G[i-1]; while(j>=0&&A[j+1]!=B[i])j=F[j]; if(A[j+1]==B[i])j++; G[i]=j; if(j==lenA-1) { ans++; i-=lenA; } tt=getchar(); if(tt==10||tt==32)break; } printf("%d",ans); return 0; }AC的代码效率:
2 | 104572 | 745559829 | 2452K | 0MS | G++ | 0.61K | 2015-11-04 17:11:56 |
然后看了铺盖学长的题解发现用栈模拟效率也不低,就写了一个= =
栈模拟的代码:
#include<cstring> #include<cstdlib> #include<cstdio> #include<iostream> #include<set> using namespace std; char A[300],B[500000]; int head,tail=0; int Alen; bool _del() { int i,j; if(tail<Alen)return false; for(i=tail,j=Alen-1;i>=tail-Alen+1;i--) { if(B[i]!=A[j])return false; j--; } return true; } int main() { int i,ans=0; char tt; scanf("%s",&A); Alen=strlen(A); getchar(); while(1) { if(tt==10||tt==32)break; while(_del()==true){tail-=Alen;ans++;} tt=getchar(); if(tt!=10||tt!=32){B[++tail]=tt;} } cout<<ans; return 0; }
9 | 104430 | 745559829 | 1468K | 45MS | G++ | 0.62K | 2015-11-04 05:39:28 |
相关文章推荐
- 错误整理(四)乱码问题
- HDOJ 题目2643 Rank(斯特林第二类数)
- Android学习--DatePicker和TimePicker使用
- 火狐打不开百度 报错sec_error_ocsp_invalid_signing_cert
- JDK动态代理实现原理--转载
- iOS 修改状态栏颜色
- [大数加法]Add Binary
- Javascript Closure
- Java设计模式——桥接模式
- js原生设计模式——3简单工厂模式\js面向对象编程实例
- [MSSQL]SQL Server 事务语法
- Python 正则
- CountDownTimer的使用
- Android适配之适配不同语言,即国际化
- System.err﹕ android.os.NetworkOnMainThreadException
- 判断一个字符串是否为另外一个字符串旋转之后的字符串
- android编程之入门篇 第一个hellloword,用java代码写控件
- UIImage部分拉伸——stretchableImageWithLeftCapWidth的使用
- php下使用ajax异步上传图片并显示缩略图
- SQL Server ANSI_NULLS , QUOTED_IDENTIFIER