首页 > 代码库 > 【POJ2774】Long Long Message 后缀自动机
【POJ2774】Long Long Message 后缀自动机
……另一道题用到,想看看部分代码对不对。于是又拿SAM交了一遍此题。
仅贴代码、
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define T 30 using namespace std; char s[N],t[N]; int pa[N<<1],son[N<<1][T]; int deep[N<<1],cnt,root,last; inline int Newnode(int _deep){deep[++cnt]=_deep;return cnt;} inline void SAM(int alp) { int u=last; last=Newnode(deep[last]+1); while(u&&!son[u][alp])son[u][alp]=last,u=pa[u]; if(!u)pa[last]=root; else { int v=son[u][alp]; if(deep[v]==deep[u]+1)pa[last]=v; else { int nv=Newnode(deep[u]+1); memcpy(son[nv],son[v],sizeof son[v]); pa[nv]=pa[v],pa[v]=pa[last]=nv; while(u&&son[u][alp]==v)son[u][alp]=nv,u=pa[u]; } } } int lena,lenb; int solve(int n) { int i,x,v,ret=0,temp=0; x=root=last=Newnode(0); for(i=1;i<=lena;i++)SAM(s[i]-'a'); for(i=1;i<=lenb;i++) { if(son[x][t[i]-'a'])x=son[x][t[i]-'a'],temp++; else { while(x&&son[x][t[i]-'a']==0)x=pa[x]; if(!x)x=root,temp=0; else temp=deep[x]+1,x=son[x][t[i]-'a']; } ret=max(ret,temp); } return ret; } int main() { // freopen("test.in","r",stdin); int i,j,n,ans=0; scanf("%s %s",s+1,t+1); lena=strlen(s+1),lenb=strlen(t+1); printf("%d\n",solve(n)); return 0; }
【POJ2774】Long Long Message 后缀自动机
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。