后缀数组的买1送2题。。。

HDU的那题数据实在是太水了,后来才发现在COJ和POJ上都是WA。。原因在一点:在建立sa数组的时候里面的n应该是字符串长度+1.。。。不懂可以去看罗大神的论文。。。

就是利用后缀数组模板求最长公共子串。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#define mem(a,b) memset(a,b,sizeof(a))
#define FOR(a,b,i) for(i=a;i<=b;++i)
#define For(a,b,i) for(i=a;i<b;++i)
#define N 1000000007
using namespace std;
inline void RD(int &ret)
{
char c;
do
{
c=getchar();
}
while(c<'0'||c>'9');
ret=c-'0';
while((c=getchar())>='0'&&c<='9')
{
ret=ret*10+(c-'0');
}
}
inline void OT(int a)
{
if(a>=10)
{
OT(a/10);
}
putchar(a%10+'0');
}
char f[2000005];
int rank[1000005],sa[1000005],top[1000005],tmp[1000005],height[1000005],wa[1000005],wb[1000005];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void makesa(int n)//后缀数组模板
{
int i,j,p=0,*t,*x=wa,*y=wb,m=300;
for(i=0; i<m; i++)
{
top[i]=0;
}
for(i=0; i<n; i++)
{
top[x[i]=f[i]]++;
}
for(i=1; i<m; i++)
{
top[i]+=top[i-1];
}
for(i=n-1; i>=0; i--)
{
sa[--top[x[i]]]=i;
}
for(j=1; p<n; j+=j,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++)
{
tmp[i]=x[y[i]];
}
for(i=0; i<m; i++)
{
top[i]=0;
}
for(i=0; i<n; i++)
{
top[tmp[i]]++;
}
for(i=1; i<m; i++)
{
top[i]+=top[i-1];
}
for(i=n-1; i>=0; i--)
{
sa[--top[tmp[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++;
}
}
}
void makeheight(int n)
{ int j,i,k;
for(i=1; i<=n; i++)
{
rank[sa[i]]=i;
}
for(i=0,k=0; i<n; height[rank[i++]]=k)
{
for(k?k--:0,j=sa[rank[i]-1]; f[i+k]==f[j+k]; k++);
}
}
int main()
{
int i,l,ll,sum;
while(scanf("%s",f)!=EOF)
{
ll=strlen(f);
l=ll;
f[ll]='&';
scanf("%s",f+l+1);
ll=strlen(f);
makesa(ll+1);//就是这里啊,一语惊醒梦中人
makeheight(ll);
sum=0;
for(i=2;i<ll;++i)
{
if(height[i]>sum)
{
if((sa[i]>l&&sa[i-1]<l)||(sa[i]<l&&sa[i-1]>l))
{
sum=height[i];
}
}
}
OT(sum);
printf("\n");
}
return 0;
}

POJ 2774 Long Long Message&&HDU 1403 Longest Common Substring&&COJ 1203的更多相关文章

  1. hdu 1403 Longest Common Substring(最长公共子字符串)(后缀数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1403 Longest Common Substring Time Limit: 8000/4000 MS (Ja ...

  2. HDU - 1403 - Longest Common Substring

    先上题目: Longest Common Substring Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/32768 K ...

  3. HDU 1403 Longest Common Substring(后缀自动机——附讲解 or 后缀数组)

    Description Given two strings, you have to tell the length of the Longest Common Substring of them. ...

  4. HDU 1403 Longest Common Substring(后缀数组,最长公共子串)

    hdu题目 poj题目 参考了 罗穗骞的论文<后缀数组——处理字符串的有力工具> 题意:求两个序列的最长公共子串 思路:后缀数组经典题目之一(模版题) //后缀数组sa:将s的n个后缀从小 ...

  5. HDU 1403 Longest Common Substring(最长公共子串)

    http://acm.hdu.edu.cn/showproblem.php?pid=1403 题意:给出两个字符串,求最长公共子串的长度. 思路: 刚开始学后缀数组,确实感觉很难,但是这东西很强大,所 ...

  6. hdu 1403 Longest Common Substring 后缀数组 模板题

    题目链接 题意 问两个字符串的最长公共子串. 思路 加一个特殊字符然后拼接起来,求得后缀数组与\(height\)数组.扫描一遍即得答案,注意判断起始点是否分别在两个串内. Code #include ...

  7. 【HDOJ】1403 Longest Common Substring

    后缀数组2倍增可解. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXM 28 ...

  8. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀数组 倍增)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 比后缀自动机慢好多(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  9. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀自动机)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

随机推荐

  1. Eclipse被汉化后恢复EN模式

    问题描述: 在安装Flush builder 的时候安装了汉化包,导致Eclipse中功能显示为汉字. 问题解决: 在Eclipse快捷方式下“目标”路径中添加-nl "EN"即可 ...

  2. Memcached安装卸载

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached ...

  3. Asp.Net(C#) MD5 加密

    /// <summary> /// MD5 字符串加密  /// </summary> /// <param name="str">需要加密的字 ...

  4. 【矩阵乘法经典应用】【ZOJ3497】【Mistwa】

    题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...

  5. css3 transiton

    div { width:100px; height:100px; background:yellow; transition-property:width; transition-duration:1 ...

  6. myeclipse中自己手动配置maven

    第一步,配置myeclipse的jdk,因为myeclipse默认的是运行在jre之上,而maven是在jdk之上 第二步,配置maven:

  7. Windows SQL Server 2012 R2 安装Intel I217-V/I218-V网卡驱动(转)

    1.下载Intel官方驱动: https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=23071&lang=zh ...

  8. C/S ASP.NET页面传值汇总

    一. QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法.但是对于传递数组或对象的话,就不 ...

  9. java入门概念个人理解之访问修饰符

      类.方法.成员变量和局部变量的对应修饰符是否可以使用 修饰符 类 成员访求 构造方法 成员变量 局部变量 abstract(抽象的) √ √ - - - static (静态的) - √ - √ ...

  10. socket 通信之select

    对于socket 通信,大家很多都用的单线程通信.同时只能监听一个端口,只能响应一个服务,select的方式可以解决多个socket 被连接的问题.一次可以分配多个资源,只要一个连接便可以进行通信.在 ...