最长公共子串 Longest Common Substring SPOJ LCS

模板题,数组要开的大一点

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define cl(a) memset(a,0,sizeof(a))
#define ll long long
#define pb(i) push_back(i)
#define mp make_pair
using namespace std;
const int maxn=2e6;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
typedef pair<int,int> PII;
ll fpow(ll n, ll k, ll p = mod) {ll r = 1; for (; k; k >>= 1) {if (k & 1) r = r * n%p; n = n * n%p;} return r;}
ll inv(ll a, ll p = mod) {return fpow(a, p - 2, p);}
//head

struct Trie
{
    int nxt[maxn][26],f[maxn],l[maxn],last,tot;
    void init()
    {
        last = tot=0;
        memset(nxt,-1,sizeof(nxt));
        f[0]=-1;
        l[0]=0;
    }
    void add(int x)
    {
        int p=last;
        int np=++tot;
        l[np]=l[p]+1;
        memset(nxt[np],-1,sizeof(nxt[np]));
        while(~p&&nxt[p][x]==-1) nxt[p][x]=np,p=f[p];
        if(p==-1) f[np]=0;
        else
        {
            int q= nxt[p][x];
            if(l[q]!=l[p]+1)
            {
                int nq=++tot;
                l[nq]=l[p]+1;
                memcpy(nxt[nq],nxt[q],sizeof(nxt[q]));
                f[nq]=f[q];
                f[q]=f[np]=nq;
                while(~p&&nxt[p][x]==q) nxt[p][x]=nq,p=f[p];
            }
            else f[np]=q;
        }
        last=np;
    }
    int fid(char *s)
    {
        int len = strlen(s);
        int res=0,tmp=0,u=0;
        for(int i=0;i<len;i++)
        {
            int x= s[i]-'a';
            if(nxt[u][x]!=-1)tmp++,u=nxt[u][x];
            else
            {
                while(~u&&nxt[u][x]==-1) u=f[u];
                if(~u) tmp = l[u]+1,u=nxt[u][x];
                else tmp=0,u=0;
            }
            res = max(res,tmp);
        }
        return res;
    }
}SAM;
char s[maxn],t[maxn];
int main()
{
    while(~scanf("%s",s))
    {
        SAM.init();
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            SAM.add(s[i]-'a');
        }
        scanf("%s",t);
        printf("%d\n",SAM.fid(t));
    }
    return 0;
}
全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务