您的位置:首页 > 其它

【大渣】【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

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的代码效率:

21045727455598292452K0MSG++0.61K2015-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;
}

91044307455598291468K45MSG++0.62K2015-11-04 05:39:28
NOIP还有2天才看KMP也是迷醉~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: