比赛 |
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;
}