HDU 2087 剪花布條 KMP(判斷不重疊區間加以判斷)在看題中逐漸理解kmp...
阿新 • • 發佈:2018-12-10
http://acm.hdu.edu.cn/showproblem.php?pid=2087
#include <iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int MAXN=1000+100; char S[MAXN],T[MAXN]; int next[MAXN]; int n,m; int cnt,last; void getFail() { next[0]=next[1]=0; for(int i=1;i<m;i++) { int j=next[i]; while(j && T[i]!=T[j]) j=next[j]; next[i+1] = (T[i]==T[j])?j+1:0; } }//next陣列模板 void KMP() { n=strlen(S); m=strlen(T); getFail(); int j=0; for(int i=0;i<n;i++) { while(j && S[i]!=T[j]) j=next[j]; if(S[i]==T[j]) j++; if(j==m) { if(cnt==0) {第一次時不用判斷 cnt++; last=i;//last指向匹配位置的末尾 } else if(i-last>=m)//如果找到了第二個及以後,那麼需要判斷一下此時匹配位置是否減去上//一個匹配位置>=m { cnt++; last=i; } } } } int main() { while(scanf("%s",S)==1) { if(strcmp(S,"#")==0) break; scanf("%s",T); cnt=0; KMP(); printf("%d\n",cnt); } return 0; }