poj 1743 Musical Theme(SAM解法)

来源:互联网 发布:java 创建加密zip 编辑:程序博客网 时间:2024/05/18 12:30




【分析】

SAM好神奇...


搞出来Parent树,在上边乱搞乱搞就可以啦

(poj挂了,所以这个题还没有交,参考一下性质就好...)



【代码】

//poj 1743 Musical Theme#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#define inf 1e9+7#define ll long long#define M(a) memset(a,0,sizeof a)#define fo(i,j,k) for(i=j;i<=k;i++)using namespace std;const int mxn=40005;int n,m,p,q,np,nq,tot,len,ans,root;int a[mxn],s[mxn],b[mxn],t[mxn],mx[mxn],mn[mxn];int son[mxn][180],step[mxn],pre[mxn];inline void sam(){int i,j;M(son),M(b);memset(mx,0,sizeof mx);memset(mn,0x3f,sizeof mn);fo(i,1,len) scanf("%d",&s[i]);fo(i,1,len-1) a[i]=s[i+1]-s[i]+88;len--;root=tot=np=1;fo(i,1,len){int c=a[i];p=np;step[np=(++tot)]=step[p]+1;while(p && !son[p][c])  son[p][c]=np,p=pre[p];if(!p){pre[np]=root;continue;}q=son[p][c];if(step[q]==step[p]+1)  pre[np]=q;else{step[nq=(++tot)]=step[p]+1;memcpy(son[nq],son[q],sizeof son[q]);pre[nq]=pre[q];pre[np]=pre[q]=nq;while(p && son[p][c]==q)  son[p][c]=nq,p=pre[p];}}}int main(){int i,j;while(scanf("%d",&len) && len){ans=0;sam();fo(i,1,tot) b[step[i]]++;fo(i,1,len) b[i]+=b[i-1];fo(i,1,tot) t[b[step[i]]--]=i;p=1;fo(i,1,len){p=son[p][a[i]];mn[p]=mx[p]=i;}for(i=tot;i>=1;i--){int now=t[i],fa=pre[now];ans=max(ans,min(mx[now]-mn[now]-1,step[now]));mx[fa]=max(mx[fa],mx[now]);mn[fa]=min(mn[fa],mn[now]);}ans++;if(ans<=4) ans=0;printf("%d\n",ans);}return 0;}


0 0