您的位置:首页 > 其它

spoj LCS 后缀自动机

2015-04-15 19:52 274 查看
链接:http://www.spoj.com/problems/LCS/

题意两串LCS

确实没什么好说的,第一次编嘛。把网上的教程斗翻出来看一遍就好了。

另发现,百度内部用户交流使用的图片在百度快照中看得到。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 2510000
#define MAXT MAXN*2
struct SAM_node
{
int pnt,len;
int nxt[26];
void Print(int id=-1)
{
printf("-----------------\n");
printf("Sam id:%d\n",id);
printf("Next :\n");
for (int i=0;i<26;i++)
printf("[%c:%d];",i+'a',nxt[i]);
printf("\n");
printf("Parent:%d\n",pnt);
printf("Length:%d\n",len);
}
}sam[MAXT];
int last=1;
int topt=1;
void Add_item(char ch)
{
int p,np;
p=last;
np=++topt;
sam[np].len=sam[p].len+1;
while (p && !sam[p].nxt[ch-'a'])
sam[p].nxt[ch-'a']=np,p=sam[p].pnt;
if (!p)
{
sam[np].pnt=1;
last=np;
}else
{
int q=sam[p].nxt[ch-'a'];
if (sam[q].len==sam[p].len+1)
sam[np].pnt=q;
else
{
int nq;
nq=++topt;
sam[nq]=sam[q];
sam[nq].len=sam[p].len+1;
sam[nq].pnt=sam[q].pnt;
sam[q].pnt=nq;
sam[np].pnt=nq;
while (p && sam[p].nxt[ch-'a']==q)
{
sam[p].nxt[ch-'a']=nq;
p=sam[p].pnt;
}
}
last=np;
}
}

char str[MAXN];
char str2[MAXN];
int main()
{
freopen("input.txt","r",stdin);
scanf("%s",str);
int n=strlen(str);
for (int i=0;i<n;i++)
Add_item(str[i]);
for (int i=0;i<=topt;i++)
{
//sam[i].Print(i);
}
scanf("%s",str2);
int now=1,res=0,ans=0;
int m=strlen(str2);
for (int i=0;i<m;i++)
{
if (sam[now].nxt[str2[i]-'a'])
{
now=sam[now].nxt[str2[i]-'a'];
res++;
ans=max(ans,res);
}else
{
while (now && !sam[now].nxt[str2[i]-'a'])
now=sam[now].pnt;
if (!now)
{
now=1;
res=0;
}
else
{
res=sam[now].len+1;
now=sam[now].nxt[str2[i]-'a'];
ans=max(ans,res);
}
}
}
printf("%d\n",ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: