后缀数组
来源:互联网 发布:拳皇苍龙知乎 编辑:程序博客网 时间:2024/05/17 23:59
Max Substring
Time limit: 1000 ms
Memory limit: 256 MB
Memory limit: 256 MB
You are given a string S. Find a string T that has the most number of occurrences as a substring in S.
If the solution is not unique, you should find the one with maximum length. If the solution is still not unique, find the smallest lexicographical one.
Standard input
The first line contains string S.
Standard output
Print string T on the first line.
Constraints and notes
- S consists of lowercase letters of the English alphabet
- The length of S is between 1 and 105
cabdab
ab
a
, b
and ab
appear 2 times, but ab
is bigger. There're no other substrings that appear more than once.
cabcabc
c
c
appears 3 times while a
, b
, ab
,ca
, bc
, abc
and cab
appear only 2 times.
ababababab
ab
Note that we're interested in substrings(continuous) not subsequences.
ab
is the winner with 5 appearances.
code:
#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fconst int maxn=1000000;int rankk[maxn],sa[maxn],height[maxn],tmp[maxn],cnt[maxn];char s[maxn];void suff(int n,int m){ int i,j,k; n++;// printf("%d %d\n",n,m); for(i=0; i<n+10; i++) rankk[i]=sa[i]=height[i]=tmp[i]=0; for(i=0; i<m; i++) cnt[i]=0; for(i=0; i<n; i++)cnt[rankk[i]=s[i]]++; for(i=1; i<m; i++) cnt[i]+=cnt[i-1]; for(i=0; i<n; i++) sa[--cnt[rankk[i]]]=i; for(k=1; k<=n; k<<=1) { for(i=0; i<n; i++) { j=sa[i]-k; if(j<0) j+=n; tmp[cnt[rankk[j]]++]=j; } sa[tmp[cnt[0]=0]]=j=0; for(i=1; i<n; i++) { if(rankk[tmp[i]]!=rankk[tmp[i-1]]||rankk[tmp[i]+k]!=rankk[tmp[i-1]+k]) cnt[++j]=i; sa[tmp[i]]=j; } memcpy(rankk,sa,n*sizeof(int)); memcpy(sa,tmp,n*sizeof(int)); if(j>=n-1) break; } for(j=rankk[height[i=k=0]=0]; i<n-1; i++,k++) while(~k&&s[i]!=s[sa[j-1]+k]) height[j]=k--,j=rankk[sa[j]+1];}int main(){ int n; scanf("%s",s); n=strlen(s); suff(n,'z'+1); int changdu=inf,geshu=0; int changduu=0,geshuu=0,biao=-1; for(int i=0; i<=n; i++) {// printf("%d\n",height[i]); if(height[i]) { geshu++; changdu=min(changdu,height[i]); if(geshu>geshuu) { geshuu=geshu; changduu=changdu; biao=sa[i]; } else if(geshu==geshuu) { if(changdu>changduu) { changduu=changdu; biao=sa[i]; } } } else { geshu=0; changdu=inf; } }if(biao==-1) printf("%s",s);else for(int i=biao; i<min(n,biao+changduu); i++) printf("%c",s[i]); printf("\n");}
阅读全文
0 0
- 后缀树/后缀数组
- 后缀树 后缀数组
- 【后缀数组】后缀排序
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 利用Session防止表单重复提交(token)
- OkHttp获取数据,xlistview显示popwod弹框
- 链表 头指针 头结点
- 跨平台开发原生应用
- ANSI Common Lisp译本笔记2
- 后缀数组
- css控制 奇数偶数行li
- (转)Android Studio配置Kotlin开发环境
- linux命令ls 和删除文件夹命令rm 复制和移动更名
- 砂砾
- 集合之ArrayList实现源码分析
- poj3169 Layout 差分约束系统 SPFA算法
- UILabel根据字数的改变,字体大小自适应
- jquery中attr和prop的区别