当前位置: 代码迷 >> 综合 >> HDU 2087 :剪花布条
  详细解决方案

HDU 2087 :剪花布条

热度:73   发布时间:2023-12-01 21:55:21.0

很简单的KMP题

#include<cstdio>
#include<cstring>
using namespace std;const int maxn=1000+100;char ch[maxn],ph[maxn];
int fail[maxn];
int n,m;inline void getFail(){fail[0]=fail[1]=0;for(int i=1;i<m;i++){int j=fail[i];while(j && ph[i]!=ph[j]) j=fail[j];fail[i+1]= (ph[i]==ph[j])?j+1:0;}
}inline int match(){int j=0;int cnt=0;for(int i=0;i<n;i++){while(j && ch[i]!=ph[j]) j=fail[j];if(ch[i]==ph[j]) j++;if(j==m){cnt++;j=0;}}return cnt;
}int main(){while(scanf("%s",ch)==1){if(ch[0]=='#') break;scanf("%s",ph);n=strlen(ch);m=strlen(ph);getFail();printf("%d\n",match());}
}