【tyvj1860】后缀数组
2016-02-17 20:11
411 查看
传送门:http://www.tyvj.cn/p/1860
[b]题解[/b]
后缀数组裸题,orzHZWER模板,具体的后缀数组可以参考“后缀数组处理字符串的有力工具”
还有一件最重要的事!!!这道题神卡常!!!需要输出优化!!!
[b]题解[/b]
后缀数组裸题,orzHZWER模板,具体的后缀数组可以参考“后缀数组处理字符串的有力工具”
还有一件最重要的事!!!这道题神卡常!!!需要输出优化!!!
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 200010 using namespace std; int n,p,q,k; int a ; int sa[2] ,rank[2] ; int h ; int c ; char str ; void calsa(int *sa,int *rank,int *Sa,int *Rank) { for(int i=1;i<=n;i++)c[rank[sa[i]]]=i; for(int i=n;i>=1;i--)if(sa[i]>k)Sa[c[rank[sa[i]-k]]--]=sa[i]-k; for(int i=n-k+1;i<=n;i++)Sa[c[rank[i]]--]=i; for(int i=1;i<=n;i++) if(rank[Sa[i]]!=rank[Sa[i-1]]||rank[Sa[i]+k]!=rank[Sa[i-1]+k]) Rank[Sa[i]]=Rank[Sa[i-1]]+1; else Rank[Sa[i]]=Rank[Sa[i-1]]; } void work() { p=0,q=1,a[0]=-1; for(int i=1;i<=n;i++)c[a[i]]++; for(int i=1;i<=26;i++)c[i]+=c[i-1]; for(int i=1;i<=n;i++)sa[p][c[a[i]]--]=i; for(int i=1;i<=n;i++) if(a[sa[p][i]]!=a[sa[p][i-1]]) rank[p][sa[p][i]]=rank[p][sa[p][i-1]]+1; else rank[p][sa[p][i]]=rank[p][sa[p][i-1]]; k=1; while(k<n) { calsa(sa[p],rank[p],sa[q],rank[q]); p^=1,q^=1,k<<=1; } } void getans() { k=0; for(int i=1;i<=n;i++) { if(rank[p][i]==1)h[rank[p][i]]=0; else{ if(k)k--; int j=sa[p][rank[p][i]-1]; while(a[i+k]==a[j+k])k++; h[rank[p][i]]=k; } } } void putt(int x) { if(!x)return ; char c=x%10+'0'; putt(x/10); putchar(c); } int main() { scanf("%s",str+1); n=strlen(str+1); for(int i=1;i<=n;i++)a[i]=str[i]-'a'+1; work(); getans(); for(int i=1;i<=n;i++) putt(sa[p][i]),putchar(' '); puts(""); for(int i=1;i<=n;i++) { if(h[i])putt(h[i]); else putchar('0'); putchar(' '); } puts(""); return 0; }
相关文章推荐
- TYVJ1193 括号序列解题报告
- TYVJ上一些DP的解题报告
- soj1041. Pushing Boxes
- P1003 Tyvj 越野跑
- Life Forms 后缀数组 不小于k个字符串中的最长子串
- TYVJ P1870 [NOIP1998P2]阶乘和
- TYVJ P2018 「Nescafé26」小猫爬山
- TYVJ P1875 [NOIP1999P1]Cantor表
- TYVJ P1334 powermax
- suffix array
- bzoj2754 后缀数组
- [POJ2774][后缀数组求LCP]Long Long Message
- [BZOJ3196][TYVJ3196][树套数][区间第k大]二逼平衡树
- 【后缀数组】poj1743Musical Theme
- 字符串匹配:后缀树组模板(关键点理解)
- P1005 采药
- P1004 滑雪
- P1003 越野跑
- P1001 第K极值
- P1000 A+B Problem