比赛 20120706 评测结果 AAWWWWAAAA
题目名称 解密 最终得分 60
用户昵称 Czb。 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-07-06 11:14:28
显示代码纯文本
#include<stdio.h>
#include<string.h>
#define oo 100000000

struct Node
{
	Node *Next[26];
	int pos;
	Node();
};

Node :: Node ()
{
	for(int i=0;i<26;i++)
		Next[i]=NULL;
	pos=-oo;
}

int n,m,l;

int a[1000010],b[1000010];

int next[1000010];

char s[100000];

bool Same(int a,int b,int k)
{
	if(a==b)return true;
	if(a<0&&b<0)return true;
	if(a>k&&b<0)return true;
	return false;
}

int main()
{
	freopen("kriptogram.in","r",stdin);
	freopen("kriptogram.out","w",stdout);
	int i,j;
	Node *Root=new Node;
	for(scanf("%s",s);s[0]!='$';scanf("%s",s))
	{
		l=strlen(s);
		Node *p=Root;
		for(i=0;i<l;i++)
		{
			if(p->Next[s[i]-'a']==NULL)
			{
				Node *q=new Node;
				p->Next[s[i]-'a']=q;
				q=NULL;delete q;
			}
			p=p->Next[s[i]-'a'];
		}
		a[n]=n-p->pos;
		p->pos=n++;
	}
	scanf("\n");
	Root=new Node;
	for(scanf("%s",s);s[0]!='$';scanf("%s",s))
	{
		l=strlen(s);
		Node *p=Root;
		for(i=0;i<l;i++)
		{
			if(p->Next[s[i]-'a']==NULL)
			{
				Node *q=new Node;
				p->Next[s[i]-'a']=q;
				q=NULL;delete q;
			}
			p=p->Next[s[i]-'a'];
		}
		b[m]=m-p->pos;
		p->pos=m++;
	}
	for(i=0;i<n;i++)
		if(a[i]>=oo)a[i]=-i-1;
	for(i=0;i<m;i++)
		if(b[i]>=oo)b[i]=-i-n-1;
	next[0]=-1;
	for(i=1,j=-1;i<m;i++)
	{
		while(j>=0&&b[i]!=b[j+1])
			j=next[j];
		if(b[i]==b[j+1])
			j++;
		next[i]=j;
	}
	for(i=0,j=-1;i<n;i++)
	{
		while(j>=0&&!Same(a[i],b[j+1],j+1))
			j=next[j];
		if(Same(a[i],b[j+1],j+1))
			j++;
		if(j==m-1)
		{
			printf("%d\n",i-m+2);
			return 0;
		}
	}
	printf("-1\n");
	return 0;
}