比较简单的应用。

#include <stdio.h>
#include <string.h>
#define maxn 200002int wa[maxn],wb[maxn],wv[maxn],ws[maxn];
int cmp(int *r,int a,int b,int l)
{return r[a]==r[b]&&r[a+l]==r[b+l];}
int max(int x,int y)
{return x>y?x:y;}
int min(int x,int y)
{return x<y?x:y;}
void da(int *r,int *sa,int n,int m)
{int i,j,p,*x=wa,*y=wb,*t;for(i=0;i<m;i++) ws[i]=0;for(i=0;i<n;i++) ws[x[i]=r[i]]++;for(i=1;i<m;i++) ws[i]+=ws[i-1];for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,i=n-j;i<n;i++) y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) ws[i]=0;for(i=0;i<n;i++) ws[wv[i]]++;for(i=1;i<m;i++) ws[i]+=ws[i-1];for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;
}
int rank[maxn],height[maxn];
void calheight(int *r,int *sa,int n)
{int i,j,k=0;for(i=1;i<=n;i++) rank[sa[i]]=i;for(i=0;i<n;height[rank[i++]]=k)for(k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++);return;
}
int r[maxn],sa[maxn];
char s[maxn];
int main()
{int i,j,len;while(scanf("%s",s)!=EOF){memset(r,0,sizeof(r));len=strlen(s);s[len]=1;scanf("%s",s+len+1);int x=strlen(s);for(i=0;i<x;i++)r[i]=s[i];da(r,sa,x+1,123);calheight(r,sa,x);int ans=0;for(i=1;i<x;i++){if(height[i]>ans){if((sa[i-1]+height[i]<len&&sa[i]>len)||(sa[i-1]+height[i]>len&&sa[i]<len))ans=height[i];}}printf("%d\n",ans);}
}

转载于:https://www.cnblogs.com/sweat123/p/4792741.html

hdu1403 后缀数组相关推荐

  1. HDU1403(后缀数组--最长公共子串)

    题目:Longest Common Substring 看代码注释请戳这里 题意:判断给定的两个串中,最长的公共串. 思路:将它们合并为一个串,然后利用后缀数组求解. 首先是二倍增算法:时间复杂度为O ...

  2. 后缀数组模板 hdu1403

    题意:就是让你求两个字符串的最大子串 #include <bits/stdc++.h> const int maxn=200005; using namespace std; int s[ ...

  3. 字符串-后缀树和后缀数组详解

    文章目录 后缀树 后缀数组 概念 sa[] rk[] height[] 例题 HDU-1403最长公共子串 洛谷P2408 不同子串个数 HDU-5769Substring 后缀树 建议先了解一下字典 ...

  4. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  5. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  6. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  7. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  8. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  9. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

最新文章

  1. 路由器简介与IOS介绍
  2. springmvc中的全注解模式
  3. composer切换源_Composer具体安装方法
  4. CCIE-LAB-第三篇-VRRP+SLA
  5. ae saber插件_AE激光插件Video Copilot Saber安装方法
  6. CADFANS2012网站源码
  7. 信息学奥赛C++语言: 小明的步行
  8. 解决比特币双重支付问题
  9. mysql给root开启远程访问权限
  10. pands库中的一些函数用法
  11. Unity 初识:创建游戏场景
  12. 计算机显示器怎么调左右,电脑屏幕内容左右看不到边怎么调
  13. 十分nb且详细的Elasticsearch教程
  14. Types of bussiness
  15. iOS开发:简易天气预报
  16. 绿色荧光标记麦胚凝集素(FITC-WGA)
  17. 如何在Outlook 2019/Office 365中运行VBA脚本邮件规则
  18. http请求HttpServletRequest详解
  19. 极客时间计算机组成原理学习笔记
  20. BP神经网络隐藏层单元数的选择--(1)

热门文章

  1. 剑指Offer #10 矩形覆盖(问题分析)
  2. URLEncoder和URLDecoder(乱码处理)
  3. php-5.4.6-win64,php5.4(64位)+apache2.4(64位)+mysql环境搭建
  4. python项目简历内容包括哪些方面_简历的基本信息包括哪些?
  5. 企业深入使用微服务后会面临哪些问题?云原生全链路灰度给了新思路
  6. 博睿数据与阿里云签订云原生核心合作伙伴计划,推动企业智能运维落地
  7. K8s 原生 Serverless 实践:ASK 与 Knative
  8. 应云而生,幽灵的威胁 - 云原生应用交付与运维的思考
  9. picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx
  10. 计算机科学技术中的优秀案例,2014级计算机科学与技术专业ppt 大赛活动案例.doc...