【spoj1811】Longest Common Substring【SAM】

SAM又神又恶心- -

#include
using namespace std;
const int maxn=250010;
struct node{
    node *f,*ch[26];
    int ml;
}pool[maxn*2],*init=pool,*cur=pool,*tail=init;
void add(int c,int len){
    node *p=tail,*np=++cur;
    np->ml=len;
    for(;p&&!p->ch[c];p=p->f) p->ch[c]=np;
    tail=np;
    if(!p) np->f=init;
    else{
        if(p->ch[c]->ml==p->ml+1) np->f=p->ch[c];
        else{
            node *q=p->ch[c],*nq=++cur;
            *nq=*q;
            nq->ml=p->ml+1;
            q->f=np->f=nq;
            for(;p&&p->ch[c]==q;p=p->f) p->ch[c]=nq;
        }
    }
}
int walk(char *t){
    node *x=init;
    int ans=0,now=0,c;
    for(;*t;++t){
        c=*t-'a';
        if(x->ch[c]) ++now,x=x->ch[c];
        else{
            while(x&&!x->ch[c]) x=x->f;
            if(!x) x=init,now=0;
            else now=x->ml+1,x=x->ch[c];
        }
        if(now>ans) ans=now;
    }
    return ans;
}
char s[maxn],t[maxn];
int main(){
    gets(s);gets(t);
    int i=0;
    for(register char *c=s;*c;++c) add(*c-'a',++i);
    printf("%d\n",walk(t));
    return 0;
}

你可能感兴趣的:(SAM)