题解:

后缀数组

求一下最长公共字串

代码:

#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. windows设置程序开机自启动

    在msconfig里面进行设置的前提是,这个程序已经在自启动列表中,只是没有被勾选上, 对于不在该启动列表里的程序需要: ①找到这个应用程序所在的位置; ②右击发送到桌面快捷方式;  ③在Window ...

  2. Unity --- 如何降低UI的填充率

    1.首先简单介绍一下什么叫填充率: Fill Rate(填充率)是指显卡每帧或者说每秒能够渲染的像素数.在每帧绘制中,如果一个像素被反复绘制的次数越多,那么它占用的资源也必然更多.目前在移动设备上,F ...

  3. 如何获取select选中的值

    一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById(“test”); 2.拿到选中项的索引: var index= ...

  4. HTML第八章总结

    Expanding your vocabulary 总述 在上一章节介绍了 CSS 的基础之后,这一章节更加具体地展开关于 CSS 的各种 rules 能够达成的效果.比如 字体:font-famil ...

  5. socket 发送图片

    using System;using System.Collections.Generic;using System.Text;using System.Net.Sockets;using Syste ...

  6. DELPHI各种颜色表达式

    颜色样本   十六进制  名称与注释  #ffb3a7 粉红:即浅红色.别称:妃色 杨妃色 湘妃色 妃红色.  #ed5736 妃色:妃红色.古同“绯”,粉红色.杨妃色.湘妃色.粉红皆同义.  #f0 ...

  7. Nr,GenBank, RefSeq, UniProt 数据库的异同

    Nr,GenBank, RefSeq, UniProt 数据库的异同 有的文章在做DEG分析时,会把reads比对到RefSeq的转录组上.我也没搞清楚这和直接比对到常规转录组上有什么区别. 文章:S ...

  8. Confluence 6 让一个空间可以公众访问

    如果你希望将一个空间分享给没有登录 Confluence 的用户(匿名用户)可以访问的话,你需要将这个空间标记为 公开(public).  让一个空间可以公开的访问的话,你就不能选择如何对这个空间进行 ...

  9. Confluence 6 管理和恢复空间管理权限

    管理和恢复空间管理权限 可能有些空间的空间管理权限被系统的超级管理删除掉了.这样的空间是没有任何空间管理员的,用户和用户组都不能对空间进行管理.只有 Confluence 管理员权限的用户可以删除一个 ...

  10. selenium 定时任务