bzoj3998 TJOI2015 弦论
2016-02-29 15:43
323 查看
字符串第k大子串
T==0 忽视相同串
T==1 统计一下节点right集合大小
到一个点你可以知道从上面到这里有多少相同子串数量和下面有多少子串 然后dfs就行了
T==0 忽视相同串
T==1 统计一下节点right集合大小
到一个点你可以知道从上面到这里有多少相同子串数量和下面有多少子串 然后dfs就行了
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define LL long long using namespace std; //by zfy =.= const int N=1000005; int p,last=1,np,cnt=1,q,nq,l ,val ,sum ,tr [26],fa ,T,k,len,wc ,sa ; char s[N/2]; void insert(int x){ p=last;np=last=++cnt;l[np]=l[p]+1;val[np]=1; for(;p&&!tr[p][x];p=fa[p]) tr[p][x]=np; if(!p) fa[np]=1; else { q=tr[p][x]; if(l[q]==l[p]+1) fa[np]=q; else { nq=++cnt;l[nq]=l[p]+1; memcpy(tr[nq],tr[q],sizeof tr[q]); fa[nq]=fa[q];fa[q]=fa[np]=nq; for(;tr[p][x]==q;p=fa[p]) tr[p][x]=nq; } } } void dfs(int x,int k){ if(k<=val[x]) return;k-=val[x]; for(int i=0;i<26;i++){ if(k<=sum[tr[x][i]]){ printf("%c",i+'a');dfs(tr[x][i],k);return; }else k-=sum[tr[x][i]]; } } int main(){ scanf("%s",s+1);scanf("%d%d",&T,&k);len=strlen(s+1); for(int i=1;i<=len;i++) insert(s[i]-'a'); for(int i=1;i<=cnt;i++) wc[l[i]]++; for(int i=1;i<=len;i++) wc[i]+=wc[i-1]; for(int i=1;i<=cnt;i++) sa[wc[l[i]]--]=i; for(int i=cnt;i;i--){ if(T==0) val[sa[i]]=1; else { val[fa[sa[i]]]+=val[sa[i]]; } sum[sa[i]]=val[sa[i]]; for(int j=0;j<26;j++) sum[sa[i]]+=sum[tr[sa[i]][j]]; }sum[1]-=val[1];val[1]=0; if(k>sum[1]) puts("-1"); else dfs(1,k); return 0; }
相关文章推荐
- Framework7中文文档
- VMwareTools安装
- Leetcode ☞ 1. Two Sum ☆ 【Hashmap】
- 华为oj 字符串分割
- HDU 4348 / SPOJ TTM To the moon [主席树]
- iOS Aspect Fill 和 Aspect Fit的区别
- 【POJ2406】Power Strings 中文题意&题解&代码(C++)
- 构造器(一)
- 安卓存储数据和文件系列4:内容提供者(Content Provider)方式
- BZOJ4010: [HNOI2015]菜肴制作
- BZOJ1070[SCOI2007]修车
- POJ3017Cut the Sequence|DP|单调队列|set
- 设置iOS项目Version Build版本号自动增加
- Shared Preference
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
- git中提示 please tell me who you are
- oracle的分析函数over(Partition by...)
- 147. Insertion Sort List【M】Java
- leetcode 326. Power of Three
- linux配置文件的区别整理