剪花布条 HDU - 2087
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
题解:多次跑kmp就过了
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn=1005; 8 9 int n,m; 10 int nex[maxn]; 11 char a[maxn],b[maxn]; 12 13 void get_next(){ 14 nex[1]=0; 15 int j=0; 16 for(int i=2;i<=m;i++){ 17 while(j>0&&b[j+1]!=b[i]) j=nex[j]; 18 if(b[j+1]==b[i]) j++; 19 nex[i]=j; 20 } 21 } 22 23 int solve(){ 24 get_next(); 25 26 int j=0,ans=0; 27 for(int i=1;i<=n;i++){ 28 while(j>0&&b[j+1]!=a[i]) j=nex[j]; 29 if(b[j+1]==a[i]) j++; 30 if(j==m){ ans++; j=0; } 31 } 32 return ans; 33 } 34 35 int main() 36 { while(scanf("%s",a+1)!=EOF){ 37 if(a[1]=='#') break; 38 39 scanf("%s",b+1); 40 a[0]=' ',b[0]=' '; 41 n=strlen(a)-1,m=strlen(b)-1; 42 43 int ans=solve(); 44 cout<<ans<<endl; 45 } 46 return 0; 47 }