首页 > 代码库 > SDUT OJ 2463 学密码学一定得学程序

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

#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 学密码学一定得学程序