SDUT 2463 学密码学一定得学程序

来源:互联网 发布:算法导论 附加部分答案 编辑:程序博客网 时间:2024/05/29 08:37

学密码学一定得学程序

Time Limit: 1000MSMemory Limit: 65536KB
SubmitStatistic Discuss

Problem Description

曾经,ZYJ同学非常喜欢密码学。有一天,他发现了一个很长很长的字符串S1。他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2。但是很不幸的是,WL忘记跟他说是什么意思了。这个时候,ZYJ不得不求助与伟大的ZP。ZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现。ZYJ恍然大悟,原来如此,但是悲剧来了,他竟然不知道怎么找。。。。是的,很囧是不是。所以这时候就需要化身为超级玛丽亚的你现身了,告诉他吧。。。。。。

Input

 

首先输入一个n。表示有n组测试数据。

每组测试数据有两行。

第一行为字符串S1,长度不大于1000000。

第二行为字符串S2,长度不大于10000,并且长度不小于2。

Output

 

输出S2在S1的位置。如果有多个位置,只输出第一个位置。

如果找不到,就输出“::>_<::“(不输出双引号)。

Example Input

1ASDFGDFDF

Example Output

3

Hint

KMP应用,万变不离其宗!!!
上模板代码!!!
#include<cstdio>#include<cstring>#define INF 1000005using namespace std;int next[1000005];void getnext(char *s,int *next){    int j,k;    j=0;k=-1;    next[0]=-1;    int len=strlen(s);    while(j<len-1)    {        if(k==-1||s[j]==s[k])        {            j++;k++;            next[j]=k;        }        else k=next[k];    }}int kmp(char *s1,char *s2){    int i=0,j=0;    getnext(s2,next);    int len1=strlen(s1);    int len2=strlen(s2);    while(i<len1&&j<len2)    {        if(j==-1||s1[i]==s2[j])        {            i++;            j++;        }        else j=next[j];//i²»±ä£¬jºóÍË¡£    }    if(j>=len2)        return (i-len2+1);    else        return -1;}int main(){    char str1[INF],str2[INF];    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s %s",str1,str2);        int num=kmp(str1,str2);        if(num!=-1)        printf("%d\n",num);       else       printf("::>_<::\n");    }    return 0;}