#include<iostream>
#include<string.h>
#include<stdio.h>
#define N 10010
#define M 1000100
using namespace std;
int next[N];
char s[M],t[N];
void getnext(char s[])
{
int i=0,j=-1,len;
next[0]=-1;
len=strlen(s);
while(i<len)
{
if(j==-1 || s[i]==s[j])
{
i++;
j++;
if(s[i]!=s[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
int KMP(char s[],char t[])
{
int i=0,j=0,len,len1;
len=strlen(s);
len1=strlen(t);
while(i<len && j<len1)
{
if(j==-1 || s[i]==t[j])
{ i++;
j++;
}
else
j=next[j];
}
if(j>=len1) return i-len1+1;
else return 0;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>s>>t;
getnext(t);
int m=KMP(s,t);
if(m)
cout<<m<<endl;
else
cout<<"::>_<::"<<endl;
}
return 0;
}
SDUT OJ 2463 學密碼學一定得學程序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.