剪花布條 HDU - 2087(KMP 貪心選擇)
阿新 • • 發佈:2018-11-06
題意:
給定兩個串S 和 T,求S中最多不重疊的包含了多少個T串.
分析:
不重疊的話,就是在正常的KMP基礎上,匹配到T的末尾的時候,j要回到0.
#include<bits/stdc++.h> using namespace std; const int maxn = 1111; char s[maxn],t[maxn]; int f[maxn]; int n,m,last,cnt; void getfail() { f[0]=f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j && t[i]!=t[j])j=f[j]; f[i+1]=t[i]==t[j]?j+1:0; } } 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=f[j]; if(s[i]==t[j])j++; if(j==m) { cnt++; j=0;///p從頭開始匹配去。正常操作是不從頭的 } } } int main() { while(scanf("%s",s)) { if(strcmp(s,"#")==0) { break; } scanf("%s",t); cnt=0; kmp(); cout<<cnt<<endl; } }