数据结构实验之串一:KMP简单应用
Time Limit: 1000MS Memory limit: 65536K
题目描述
输入
输出
示例输入
abc a 123456 45 abc ddd
示例输出
1 4-1
方法一
#include<stdio.h> #include<string.h> #include<stdlib.h> #define strmax 1000005 char s[strmax],t[strmax]; int next[strmax]; int n; int m; void getnext(char t[]) { int i = 0,j = -1; next[0]=-1; while(i < m) { if(j == -1 || t[i] == t[j]) { i++; j++; if(t[i] != t[j]) { next[i]=j; } else { next[i]=next[j]; } } else { j = next[j]; } } } void kmp(char s[],char t[]) { int i,j; i = j = 0; while(i < n && j < m) { if(j == -1 || s[i] == t[j]) { i++; j++; } else { j = next[j]; } } if(j == m) { printf("%d\n",i-m+1); } else { printf("-1\n"); } } int main() { while(~scanf("%s %s",s,t)) { n=strlen(s); m=strlen(t); getnext(t); kmp(s,t); } return 0; }
方法二
#include<stdio.h> #include<string.h> char a[10000010],b[1000010]; int next[1000010],n,m; void Next() { next[0]=-1; for(int j=1;j<m;j++) { int i=next[j-1]; while(b[j]!=b[i+1]&&i>=0) { i=next[i]; } if(b[j]==b[i+1]) { next[j]=i+1; } else next[j]=-1; } } int KMP() { Next(); int p=0,s=0; while(p<m&&s<n) { if(a[s]==b[p]) { s++; p++; } else { if(p==0) s++; else p=next[p-1]+1; } } if(p<m) return -1; else return s-m+1; } int main() { int i,j,k,t; while(scanf("%s",a)!=EOF) { scanf("%s",b); n=strlen(a); m=strlen(b); k=KMP(); printf("%d\n",k); } }