题意:输入多组,判断str2是否是str1的字串,是则输出串1在串2中的位置,否则输出-1;
- //当主串中第i个字符与模式中第j个字符“失配”时,
- //主串中第i个字符应该与模式中哪个字符再比较。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- char str1[1000000],str2[1000000];
- int next[1000000];
- void getnext(int t)//next[j]表示当模式中第j个字符与主串中相应字符“失配”时,在模式中需要重新和主串中该字符进行比较的字符的位置。
- {
- int i,j;
- i=1;j=0;next[i]=0;
- while(i<=t)
- {
- if(j==0||str2[i-1]==str2[j-1])
- {
- i++;j++;
- next[i]=j;
- }
- else
- j=next[j];
- }
- }
- int KMP(int s,int t)
- {
- int i,j;
- i=1;j=1;
- while(i<=s&&j<=t)
- {
- if(j==0||str1[i-1]==str2[j-1])
- {
- i++;j++;
- }
- else
- j=next[j];
- }
- if(j>t)
- return (i-t);
- else
- return -1;
- }
- int main()
- {
- int s,t,g;
- while(~scanf(“%s%s”,str1,str2))
- {
- s=strlen(str1);
- t=strlen(str2);
- getnext(t);
- g=KMP(s,t);
- printf(“%d\n”,g);
- }
- return 0;
- }