poj 2774
传送门:http://poj.org/problem?id=2774
裸的后缀数组,我只是为了贴个版而已
代码
#include <cstdio>
#include <cmath>
#include <iostream>
#include <cstring>
#include <algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
int s[200005],wa[200005],wb[200005],ws1[200005],sz[200005],wv[200005],rank[200005],sa[200005],height[200005];
char s1[200005],s2[200005];
bool cmp(int *x,int a,int b,int k)
{
return (x[a]==x[b])&&(x[a+k]==x[b+k]);
}
void getsa(int *r,int *sa,int n,int m)
{
int i,j,p,*x=wa,*y=wb,*t;
for (i=0;i<m;i++) ws1[i]=0;
for (i=0;i<n;i++) ws1[x[i]=r[i]]++;
for (i=1;i<m;i++) ws1[i]+=ws1[i-1];
for (i=n-1;i>=0;i--) sa[--ws1[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++) ws1[i]=0;
for (i=0;i<n;i++) ws1[wv[i]]++;
for (i=1;i<m;i++) ws1[i]+=ws1[i-1];
for (i=n-1;i>=0;i--) sa[--ws1[wv[i]]]=y[i];
t=x;x=y;y=t;
x[sa[0]]=0;
for (p=1,i=1;i<n;i++)
{
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
return;
}
void getans(int *r,int n)
{
int i,j,k=0;
for (i=1;i<=n;i++) rank[sa[i]]=i;
for (i=0;i<n;i++)
{
if (k) k--;
else k=0;
j=sa[rank[i]-1];
while (r[i+k]==r[j+k])
{
k++;
}
height[rank[i]]=k;
}
return;
}
int main()
{
while (~scanf("%s",s1))
{
int t=0;
scanf("%s",s2);
int len=strlen(s1);
int x1=0;
for (int i=0;i<len;i++)
s[x1++]=s1[i]-'a'+1;
s[x1++]=28;
len=strlen(s2);
for (int i=0;i<len;i++)
s[x1++]=s2[i]-'a'+1;
s[x1]=0;
getsa(s,sa,x1+1,30);
getans(s,x1);
int ans=0;
len=strlen(s1);
for (int i=2;i<x1;i++)
if(height[i]>ans)
{
if(0<=sa[i-1]&&sa[i-1]<len&&len<sa[i])
ans=height[i];
if(0<=sa[i]&&sa[i]<len&&len<sa[i-1])
ans=height[i];
}
printf("%d\n",ans);
}
}
poj 2774的更多相关文章
- [POJ 2774] Long Long Message 【后缀数组】
题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...
- poj 2774 最长公共子串 后缀数组
Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 25752 Accepted: 10 ...
- POJ - 2774~POJ - 3415 后缀数组求解公共字串问题
POJ - 2774: 题意: 求解A,B串的最长公共字串 (摘自罗穗骞的国家集训队论文): 算法分析: 字符串的任何一个子串都是这个字符串的某个后缀的前缀. 求 A 和 B 的最长 公共子串等价于求 ...
- POJ 2774 后缀数组
题目链接:http://poj.org/problem?id=2774 题意:给定两个只含小写字母的字符串,求字符串的最长公共子串长度. 思路:根据<<后缀数组——处理字符串的有力工具&g ...
- 字符串hash + 二分答案 - 求最长公共子串 --- poj 2774
Long Long Message Problem's Link:http://poj.org/problem?id=2774 Mean: 求两个字符串的最长公共子串的长度. analyse: 前面在 ...
- poj - 2774 - Long Long Message
题意:输入2个长度不超过100000的字符串,问它们最长公共子串的长度. 题目链接:http://poj.org/problem?id=2774 ——>>后缀数组!后缀数组!-从LJ的&l ...
- poj 2774 最长公共子--弦hash或后缀数组或后缀自己主动机
http://poj.org/problem?id=2774 我想看看这里的后缀数组:http://blog.csdn.net/u011026968/article/details/22801015 ...
- POJ 2774 Long Long Message(后缀数组)
[题目链接] http://poj.org/problem?id=2774 [题目大意] 求最长公共子串 [题解] 将两个串中间嵌一个字符相连,求一遍后缀数组 如果排名相邻的两个后缀的开端是分属于两个 ...
- ●POJ 2774 Long Long Message
题链: http://poj.org/problem?id=2774题解: 后缀自动机 使用后缀自动机匹配,思路如下: 即如果当前的x字符匹配失败了,就可以从当前已经匹配的串的后缀去继续匹配. 然后不 ...
随机推荐
- SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...
- Swift 必备开发库10个
1.CryptoSwift swift加密库, 支持md5,sha1,sha224,sha256... github地址: https://github.com/krzyzanowskim/Crypt ...
- vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver
在vert.x中使用模板解析,可以为我们带来很多方便.我这里学习了一下ClassLoaderTemplateResolver的简单使用.这次工程配置与上篇一样,不需要做任何多的配置.直接编写代码就可以 ...
- ASP.Net的两种开发模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- C++ 环形缓冲区的实现
参考文章:http://blog.csdn.net/linyt/article/details/53355355 本文参考linux系统中 kfifo缓冲区实现.由于没有涉及到锁,在多线程环境下,只适 ...
- C# DataTable分页处理
有时候我们从数据库获取的数据量太大,而我们不需要一次性显示那么多的时候,我们就要对数据进行分页处理了,让每页显示不同的数据. public DataTable GetPagedTable(DataTa ...
- QFileSystemModel
#include "dialog.h" #include "ui_dialog.h" Dialog::Dialog(QWidget *parent) : QDi ...
- javaScript的简单学习
JavaScript介绍 JavaScript跟java没半毛钱关系 JavaScript有三部分组成:ECMAScript,document object model,broswer object ...
- phpexcel 导出 科学计数问题
今天在用php做excel导出的时候遇到了一个小问题,如图 单元格默认格式为常规格式,当数值过长时就会变成科学计数. 解决方法: 如果输出的excel的$data数据是手动添加的,那就在对应值得后面添 ...
- LeetCode Find All Anagrams in a String
原题链接在这里:https://leetcode.com/problems/find-all-anagrams-in-a-string/ 题目: Given a string s and a non- ...