曾经,ZYJ同学非常喜欢密码学。有一天,他发现了一个很长很长的字符串S1。他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2。但是很不幸的是,WL忘记跟他说是什么意思了。这个时候,ZYJ不得不求助与伟大的ZP。ZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现。ZYJ恍然大悟,原来如此,但是悲剧来了,他竟然不知道怎么找。。。。是的,很囧是不是。所以这时候就需要化身为超级玛丽亚的你现身了,告诉他吧。。。。。。
首先输入一个n。表示有n组测试数据。
每组测试数据有两行。
第一行为字符串S1,长度不大于1000000。
第二行为字符串S2,长度不大于10000,并且长度不小于2。
输出S2在S1的位置。如果有多个位置,只输出第一个位置。
如果找不到,就输出“::>_<::“(不输出双引号)。
3
#include <stdio.h> #include <stdlib.h> #include<string.h> #define max 1000001 #define min 10001 char s1[max],s2[min]; int next[max]; void get_next(char s2[],int next[]) { int i=0; next[0]=-1; int j=-1; int l2=strlen(s2); while(i<l2) { if(j==-1||s2[i]==s2[j]) { ++i;++j; next[i]=j; } else j=next[j]; } } void Index_KMP(char s1[],char s2[],int pos) { int i=0,j=0; int l1=strlen(s1),l2=strlen(s2); while(i<l1&&j<l2) { if(j==-1||s1[i]==s2[j]) { ++i;++j; } else j=next[j]; } if(j==l2) printf("%d\n",i-l2+1); else printf("::>_<::\n"); } void Find(char s1[],char s2[]) { int i=0,j=0; while(s1[i+j]!='\0'&&s2[j]!='\0') { if(s1[i+j]==s2[j]) j++; else { i++; j=0; } } if(s2[j]=='\0') printf("%d\n",i+1); else printf("::>_<::\n"); } int main() { int n,i; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%s\n%s",s1,s2); get_next(s2,next); // scanf("%s",s2); Index_KMP(s1,s2,0); } return 0; }