ural1517
题解:
后缀数组
求一下最长公共字串
代码:
#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的更多相关文章
- ural1517后缀数组
题意:求两串字符(0————255)的最长公共字串 思路:先将两个字符链接起来,中间用一个不曾出现过的字符,然后直接求出height数组,然后根据它的特性,求出最长的公共字串,当然这个最长公共字串的坐 ...
- [URAL-1517][求两个字符串的最长公共子串]
Freedom of Choice URAL - 1517 Background Before Albanian people could bear with the freedom of speec ...
- 【POJ2774&Ural1517】Long Long Message(后缀数组)
题意:求两个字符串的最长公共子串 n<=1000 思路:这是一道论文题 ..]of longint; n,l1,l2,i,ans,m,l,r:longint; ch:ansistring; pr ...
- 后缀数组基本问题QAQ
以下题目均来自罗穗骞的论文... No.1最长公共前缀 最长公共前缀: 题目: 给定一个字符串,询问某两个后缀的最长公共前缀. 分析: 某两个后缀的最长公共前缀就是区间height最小值,转化为RMQ ...
- UOJ #35. 后缀排序[后缀数组详细整理]
#35. 后缀排序 统计 描述 提交 自定义测试 这是一道模板题. 读入一个长度为 nn 的由小写英文字母组成的字符串,请把这个字符串的所有非空后缀按字典序从小到大排序,然后按顺序输出后缀的第一个字符 ...
- POJ 3294 UVA 11107 Life Forms 后缀数组
相同的题目,输出格式有区别. 给定n个字符串,求最长的子串,使得它同时出现在一半以上的串中. 不熟悉后缀数组的童鞋建议先去看一看如何用后缀数组计算两个字符串的最长公共子串 Ural1517 这道题的思 ...
- Ural 1517. Freedom of Choice 后缀数组
Ural1517 所谓后缀数组, 实际上准确的说,应该是排序后缀数组. 一个长度为N的字符串,显然有N个后缀,将他们放入一个数组中并按字典序排序就是后缀数组的任务. 这个数组有很好的性质,使得我们运行 ...
随机推荐
- 虹软人脸识别Android Sample Code
AFR_FSDKInterface engine = new AFR_FSDKEngine(); //用来存放提取到的人脸信息, face_1 是注册的人脸,face_2 是要识别的人脸 AFR_FS ...
- LeetCode第[20]题(Java):Valid Parentheses
题目:有效的括号序列 难度:Easy 题目内容: Given a string containing just the characters '(', ')', '{', '}', '[' and ' ...
- 算法笔记--FFT
推荐阅读资料:算法导论第30章 本文不做证明,详细证明请看如上资料. FFT在算法竞赛中主要用来加速多项式的乘法 普通是多项式乘法时间复杂度的是O(n2),而用FFT求多项式的乘法可以使时间复杂度达到 ...
- Redis持久化AOF和RDB对比
RDB持久化 AOF持久化 全量备份,一次保存整个数据库 增量备份,一次保存一个修改数据库的命令 保存的间隔较长 保存的间隔默认一秒 数据还原速度快 数据还原速度一般 save会阻塞,但bgsave或 ...
- Spring之Spel表达式
正常业务场景一般不用这个技术,但需要知道有这么个东西支持Spring. 记忆力不好,抄了些套路代码便于以后用到. package com.paic.phssp.springtest.spel; imp ...
- ADO.NET介绍2
一.Connection对象 Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接.所有Connection对象的基类都是DbConnection类. Co ...
- Ubuntu/Debian nginx 简介
Linux运营维护(简称运维) 这里是简单的使用介绍: 参考:http://einverne.github.io/post/2017/06/ubuntu-debian-install-nginx.ht ...
- 使用scrapy-crawlSpider 爬取tencent 招聘
Tencent 招聘信息网站 创建项目 scrapy startproject Tencent 创建爬虫 scrapy genspider -t crawl tencent 1. 起始url sta ...
- locust 学习中
[转自]http://blog.51cto.com/youerning/2089930 前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试 ...
- vue开发移动端项目 过渡动画问题
App.vue: <div id="app"> <div class="content"> <transition :name ...