hdu2087kmp模板练习
Posted randy-lo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu2087kmp模板练习相关的知识,希望对你有一定的参考价值。
题目网址:http://icpc.njust.edu.cn/Problem/Hdu/2087/
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef unsigned int ui; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define pf printf 7 #define mem(a,b) memset(a,b,sizeof(a)) 8 #define prime1 1e9+7 9 #define prime2 1e9+9 10 #define pi 3.14159265 11 #define lson l,mid,rt<<1 12 #define rson mid+1,r,rt<<1|1 13 #define scand(x) scanf("%llf",&x) 14 #define f(i,a,b) for(int i=a;i<=b;i++) 15 #define scan(a) scanf("%d",&a) 16 #define dbg(args) cout<<#args<<":"<<args<<endl; 17 #define inf 0x3f3f3f3f 18 #define maxn 100010 19 int n,m,t; 20 char s[maxn],p[maxn],nxt[maxn]; 21 void getnxt() 22 { 23 int plen=strlen(p); 24 int i=-1,j=0; 25 nxt[0]=-1; 26 while(j<plen) 27 { 28 if(i==-1||p[i]==p[j]) 29 { 30 i++,j++; 31 if(p[i]==p[j])nxt[j]=nxt[i]; 32 else nxt[j]=i; 33 } 34 else i=nxt[i]; 35 } 36 } 37 int kmp() 38 { 39 int plen=strlen(p); 40 int slen=strlen(s); 41 int j=0,i=0; 42 int cnt=0; 43 while(i<slen) 44 { 45 if(j==-1||s[i]==p[j])i++,j++; 46 else j=nxt[j]; 47 if(j==plen) 48 { 49 j=0,cnt++; 50 } 51 } 52 return cnt; 53 } 54 int main() 55 { 56 //freopen("input.txt","r",stdin); 57 //freopen("output.txt","w",stdout); 58 std::ios::sync_with_stdio(false); 59 while(scanf("%s",s)) 60 { 61 if(!strcmp(s,"#"))break; 62 scanf(" %s",p); 63 getnxt(); 64 pf("%d ",kmp()); 65 } 66 }
以上是关于hdu2087kmp模板练习的主要内容,如果未能解决你的问题,请参考以下文章