• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
mhy12345
博客园    首页    新随笔    联系   管理    订阅  订阅

spoj LCS 后缀自动机

链接: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);
}

 

by mhy12345(http://www.cnblogs.com/mhy12345/) 未经允许请勿转载

本博客已停用,新博客地址:http://mhy12345.xyz

posted @ 2015-04-15 19:52  mhy12345  阅读(139)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3