题解:

后缀数组

求一下最长公共字串

代码:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=;
char s1[N],m,n,s2[N],ss[N];
int height[N],str[N],sa[N],Log[N],best[][N],rank[N],c[N],t1[N],t2[N];
void da(int *str,int n,int m)
{
int *x=t1,*y=t2;
for (int i=;i<m;i++)c[i]=;
for (int i=;i<n;i++)c[x[i]=str[i]]++;
for (int i=;i<m;i++)c[i]+=c[i-];
for (int i=n-;i>=;i--)sa[--c[x[i]]]=i;
for (int k=;k<=n;k<<=)
{
int p=;
for (int i=n-k;i<n;i++)y[p++]=i;
for (int i=;i<n;i++)
if (sa[i]>=k)y[p++]=sa[i]-k;
for (int i=;i<m;i++)c[i]=;
for (int i=;i<n;i++)c[x[y[i]]]++;
for (int i=;i<m;i++)c[i]+=c[i-];
for (int i=n-;i>=;i--)sa[--c[x[y[i]]]]=y[i];
swap(x,y);
p=;x[sa[]]=;
for (int i=;i<n;i++)
x[sa[i]]=y[sa[i]]==y[sa[i-]]&&y[sa[i]+k]==y[sa[i-]+k]?p-:p++;
if (p>=n)break;
m=p;
}
}
void calheight(int *str,int n)
{
int j,k=;
for (int i=;i<=n;i++)rank[sa[i]]=i;
for (int i=;i<n;i++)
{
if (k)k--;
j=sa[rank[i]-];
while (str[i+k]==str[j+k])k++;
height[rank[i]]=k;
}
}
void init(int n)
{
Log[]=-;
for (int i=;i<=n;i++)Log[i]=(i&(i-))?Log[i-]:Log[i-]+;
for (int i=;i<=n;i++)best[][i]=height[i];
for (int i=;i<=Log[n];i++)
for (int j=;j<=n;j++)best[i][j]=min(best[i-][j],best[i-][j+(<<(i-))]);
}
int lcp(int a,int b)
{
a=rank[a];
b=rank[b];
if (a>b)swap(a,b);
a++;
int t=Log[b-a+];
return min(best[t][a],best[t][b-(<<t)+]);
}
int main()
{
while (~scanf("%d",&m))
{
scanf("%s%s",s1,s2);
int l1=strlen(s1);
int l2=strlen(s2);
int len=;
for (int i=;i<l1;i++)str[len++]=s1[i];
str[len++]=;
for (int i=;i<l2;i++)str[len++]=s2[i];
str[len]=;
da(str,len+,);
calheight(str,len);
int be,ans=;
for (int i=;i<=len;i++)
{
if ((sa[i]<l1&&sa[i-]>l1)||(sa[i]>l1&&sa[i-]<l1))
if (ans<height[i])ans=height[i],be=sa[i];
}
for (int i=be;i<be+ans;i++)putchar(str[i]);
puts("");
}
return ;
}

ural1517的更多相关文章

  1. ural1517后缀数组

    题意:求两串字符(0————255)的最长公共字串 思路:先将两个字符链接起来,中间用一个不曾出现过的字符,然后直接求出height数组,然后根据它的特性,求出最长的公共字串,当然这个最长公共字串的坐 ...

  2. [URAL-1517][求两个字符串的最长公共子串]

    Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speec ...

  3. 【POJ2774&Ural1517】Long Long Message(后缀数组)

    题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...

  4. 后缀数组基本问题QAQ

    以下题目均来自罗穗骞的论文... No.1最长公共前缀 最长公共前缀: 题目: 给定一个字符串,询问某两个后缀的最长公共前缀. 分析: 某两个后缀的最长公共前缀就是区间height最小值,转化为RMQ ...

  5. UOJ #35. 后缀排序[后缀数组详细整理]

    #35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...

  6. POJ 3294 UVA 11107 Life Forms 后缀数组

    相同的题目,输出格式有区别. 给定n个字符串,求最长的子串,使得它同时出现在一半以上的串中. 不熟悉后缀数组的童鞋建议先去看一看如何用后缀数组计算两个字符串的最长公共子串 Ural1517 这道题的思 ...

  7. Ural 1517. Freedom of Choice 后缀数组

    Ural1517 所谓后缀数组, 实际上准确的说,应该是排序后缀数组. 一个长度为N的字符串,显然有N个后缀,将他们放入一个数组中并按字典序排序就是后缀数组的任务. 这个数组有很好的性质,使得我们运行 ...

随机推荐

  1. 查询选修了全部课程的学生姓名_如何解?-MS-SQLServer/应用实例

    查询选修了全部课程的学生姓名:student 是学生表 course 是选课表 sc 是课程表select snamefrom studentwhere not exists(select *from ...

  2. cocos2dx 如何获得节点的类型

    1. 需求:在所有子节点中得到是ui::Text类型的节点,并对其进行操作. 2. 解决方案:在根节点Node中有一个如下的函数: /** * Gets the description string. ...

  3. Spring Boot的@SpringBootApplication无法引入的问题

    转自:https://blog.csdn.net/cckevincyh/article/details/78962002 今天搭建了springboot,一开始遇到了一个问题,在自己创建的HelloA ...

  4. JAVA基础知识总结:十九

    一.多线程使用过程中的临界资源问题 1.临界资源:被多个线程同时访问的资源 临界资源产生的原因:有多个线程同时访问一个资源的时候,如果一个线程在取值的过程中,时间片又被其他的线程抢走了,临界资源问题就 ...

  5. mybatis-generator-core 自动生成实体和Mapper

    所谓mybatis-generator-core就是利用mybatis-generator-core.jar自动生成数据库对应的实体和映射文件.首先要下载mybatis-generator-core- ...

  6. Python 编程快速上手 第十七章 操作图像

    前言 在这一章节,讲了关于图像的三个方面的内容: 获得图像的相关信息:例如 RGBA 值,尺寸... 对图像进行编辑操作:例如 旋转,缩放... 在图像上绘制形状:例如 矩形,圆形... [Image ...

  7. gitignore有时候为啥过滤不了文件或目录

    一.问题介绍 使用Git过程中,有时候我们想过滤项目中的部分文件,在.gitignore中加入该文件名称或该文件所在目录的名称,比如我们的项目日志文件(.log文件) 但是有时候发现不管用.不好使. ...

  8. Maxim and Array CodeForces - 721D (贪心)

    大意: 给定序列, 每次操作选择一个数+x或-x, 最多k次操作, 求操作后所有元素积的最小值 贪心先选出绝对值最小的调整为负数, 再不断选出绝对值最小的增大它的绝对值 #include <io ...

  9. sqlserver给指定用户授权访问指定表

    一.   背景 外部公司的人授权访问我们公司的数据库,数据接口调用,要给他们建立查看指定的视图和授权的账号,因此要在数据库中,给指定用户授权访问指定表 二.sqlserver 脚本 ---创建视图CR ...

  10. cf-914D-线段树

    http://codeforces.com/contest/914/problem/D 题目大意是给出一个数列,进行两种操作,一个是将位置i的数置为x,另一个操作是询问[l,r]内的数的gcd是不是x ...