剪花布条
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4623 Accepted Submission(s): 3103
abcde a3 aaaaaa aa #
0 3分析:本题是在主串中能找出有几个子串。KMP算法返回子字符串在主串中从给定的位置起第一次出现的位置,我们可以重复的利用这个过程,就可以得到结果;代码:/* 功能Function Description: 字符串匹配 开发环境Environment: DEV C++ 4.9.9.1 技术特点Technique: 未改进的 KMP算法 版本Version: 1 作者Author: qing du 日期Date: 20120808 备注Notes: */
#include <iostream> #include <cstring> #include <stdlib.h> using namespace std; typedef char *SString; int len,next[1000]; void get_next(SString s) // KMP算法 { int i,j; i=1; next[1]=0; j=0; while(i<len) { if(j==0||s[i]==s[j]) { ++i; ++j; next[i]=j; } else j=next[j]; } }
int Index(SString S,SString T,int pose) { int i,j; i=pose; j=1; get_next(T); while(i<=S[0]&&j<=T[0]) { if(j==0||S[i]==T[j]) {++i;++j;} else j=next[j]; } if(j>T[0]) return i-T[0]; else return 0; }
int main() { char a[1010],b[1010]; int c[1010],pos1,pos2,k,flag; while(1) { cin>>a+1;if(a[1]=='#') break; cin>>b+1; a[0]=strlen(a+1); b[0]=strlen(b+1); len=b[0]; pos1=1; pos2=k=0; while(pos1<=a[0]) { pos2=Index(a,b,pos1); //cout<<pos1<<"*"<<pos2<<"*"<<endl; if(pos2==0) break; else {k++;pos1=pos2+b[0]; } } cout<<k<<endl; } system("pause"); return 0; }