题意:

  求两个字符串的LCP

SOL:

  模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing)

  后缀数组概念...还算是简单的,过程也非常清晰...就是老人家...马丹代码那么写意真的是...每一句代码的意思大概都知道但是不能很准确的描述...自己实现又漏洞百出...所以虽然避免了抄模板...但还是相当于一个默写的过程...

  然后这个题目...非常显然嘛不是...然后就打了...然后开始调...TLE...TLE...TLE...日了狗了...

  然后对拍,发现有bug,那么就gdb...

  然后发现不行,代码改的看不懂了.

  然后推倒重来...反正多默写一遍多熟悉一点...  然后... TLE...

  什么鬼啊!!!!

  然后觉得什么都没什么问题...然后开始改读入... RE...

  然后继续改读入... 因为一个终端跑着10w数据的对拍巨卡无比

  然后在卡死的边缘交了一发

  卡着卡着就绿了...

  日了狗了啊woc!

  然而写出来还是慢了很多...

  然后才发现貌似原来用scanf的时候一直在调用strlen...

  算了算了不想改回去测了...

  什么jb!   我一天就调了这么一道题...

  我可以假装说我对后缀数组的理解更深了一步.

  什么鬼啊!!!!!

  然后贴一张令人崩溃的图.

  

随处可见效率比我高的代码,但还是要贴一贴.

  Code:

    

/*==========================================================================
# Last modified: 2016-03-14 17:47
# Filename: poj2774.cpp
# Description:
==========================================================================*/
#define me AcrossTheSky
#include <cstdio>
#include <cmath>
#include <ctime>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> #include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector> #define lowbit(x) (x)&(-x)
#define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
#define FORP(i,a,b) for(int i=(a);i<=(b);i++)
#define FORM(i,a,b) for(int i=(a);i>=(b);i--)
#define ls(a,b) (((a)+(b)) << 1)
#define rs(a,b) (((a)+(b)) >> 1)
#define getlc(a) ch[(a)][0]
#define getrc(a) ch[(a)][1] #define maxn 200000
#define maxm 100000
#define pi 3.1415926535898
#define _e 2.718281828459
#define INF 1070000000
using namespace std;
typedef long long ll;
typedef unsigned long long ull; template<class T> inline
void read(T& num) {
bool start=false,neg=false;
char c;
num=0;
while((c=getchar())!=EOF) {
if(c=='-') start=neg=true;
else if(c>='0' && c<='9') {
start=true;
num=num*10+c-'0';
} else if(start) break;
}
if(neg) num=-num;
}
/*==================split line==================*/
//char temp1[maxn],temp[maxn];
int s[maxn];
int t[maxn],t2[maxn],c[100],rank[maxn],sa[maxn];
int height[maxn];
int n;
void build_sa(int m){
int *x=t,*y=t2;
//memset(c,0,sizeof(c));
FORP(i,0,m) c[i]=0;
FORP(i,0,n-1) c[x[i]=s[i]]++;
FORP(i,1,m-1) c[i]+=c[i-1];
FORM(i,n-1,0) sa[--c[x[i]]]=i;
for (int k=1;k<=n;k <<= 1){
int p=0;
FORP(i,n-k,n-1) y[p++]=i;
FORP(i,0,n-1) if (sa[i]>=k) y[p++]=sa[i]-k; FORP(i,0,m) c[i]=0;
FORP(i,0,n-1) c[x[y[i]]]++;
FORP(i,1,m-1) c[i]+=c[i-1];
FORM(i,n-1,0) sa[--c[x[y[i]]]]=y[i]; swap(x,y);
p=1; x[sa[0]]=0;
FORP(i,1,n-1)
if (y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k])
x[sa[i]]=p-1;
else x[sa[i]]=p++;
if (p>=n) break;
m=p;
}
}
void getheight(){
int k=0;
FORP(i,0,n-1) rank[sa[i]]=i;
FORP(i,0,n-1){
if (k) k--;
int j=sa[rank[i]-1];
while (s[i+k] == s[j+k]) k++;
height[rank[i]]=k;
}
}
int main(){
//s[strlen(s)]='`';
char ch;
while ((ch=getchar())>='a' && ch<='z') s[n++]=ch-'a'+1;
s[n]=0;
int len=n-1; n++;
while ((ch=getchar())!=EOF && ch>='a' && ch<='z') s[n++]=ch-'a'+1;
s[n]=29;
n++;
build_sa(30);
getheight();
int ans=0;
FORP(i,1,n-1){
if (height[i]>ans){
if (sa[i-1]<len && sa[i]>=len) ans=max(height[i],ans);
if(sa[i-1]>=len && sa[i]<len) ans=max(height[i],ans);
}
}
printf("%d\n",ans);
}

POJ2774 & 后缀数组模板题的更多相关文章

  1. BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题

    BZOJ 1031 [JSOI2007]字符加密Cipher | 后缀数组模板题 将字符串复制一遍接在原串后面,然后后缀排序即可. #include <cmath> #include &l ...

  2. POJ 2774 Long Long Message 后缀数组模板题

    题意 给定字符串A.B,求其最长公共子串 后缀数组模板题,求出height数组,判断sa[i]与sa[i-1]是否分属字符串A.B,统计答案即可. #include <cstdio> #i ...

  3. 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message

    Language: Default Long Long Message Time Limit: 4000MS   Memory Limit: 131072K Total Submissions: 21 ...

  4. 后缀数组 模板题 hdu1403(最长公共(连续)子串)

    好气啊,今天没有看懂后缀树和后缀自动机 只能写个后缀数组发泄一下了orz #include <cstdio> #include <cstring> *; int wa[N], ...

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

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

  6. [UOJ#35] [UOJ后缀数组模板题] 后缀排序 [后缀数组模板]

    后缀数组,解决字符串问题的有利工具,本题代码为倍增SA算法 具体解释详见2009年国家集训队论文 #include <iostream> #include <algorithm> ...

  7. 洛谷:P3809 【模板】后缀排序(后缀数组模板)

    P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...

  8. 【BZOJ 1031】[JSOI2007]字符加密Cipher(后缀数组模板)

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1031 [题意] [题解] 后缀数组模板题; 把整个字符串扩大一倍. 即长度乘2 然后搞 ...

  9. 【UOJ #35】后缀排序 后缀数组模板

    http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...

随机推荐

  1. Ionic2 Tutorial

    build your first app Now that you have Ionic and its dependencies installed, you can build your firs ...

  2. Analysis Services OLAP 概述2

    在DW/BI系统中,关系型数据库是存储和管理数据的最佳场所.但是关系数据库本身的智能化程度不够.关系型数据库缺乏如下功能: 丰富的元数据,帮助用户浏览数据和创建查询. 强大的分析计算和函数,在对上下文 ...

  3. Java 初学记录之一 快速输入

    1. sysout 按回车 System.out.println();

  4. php获取文件夹下面的文件列表和文件夹列表

    function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir( $dir ))) { $i=0; while ...

  5. [Outlook] Outlook2013能收但无法发送邮件-0x800CCC13, 0x800CCC0B, 0x8004210B

    [20140704更新],在公司收邮件的时候,问题再次出现,错误码:0x800ccc13,按照以下方法测试成功: 1. 按照以前办法,反复重启,失败 2. 按照以下参考连接A中的步骤 a. Click ...

  6. jsp,图片显示

    问题:jsp中显示项目中image文件夹中的图片 1,项目中image文件夹中有对应的图片 2,<img ,src="/项目名/image/图片名.jpg">,用其他变 ...

  7. VS2010下配置OpenMesh

    从www.openmesh.org下载最新版的安装包或者源代码,注意下载与自己系统匹配的版本,我下的是VS2010预编译版的,下载源码自己编译是一样的.安装好Visual Studio. 安装Open ...

  8. V for Vendetta

    V for Vendetta V字仇杀队 复仇者V 安迪·沃卓斯基 and Larry Wachowski 思想,是最强大的武器.因为,世界上的独裁政府,有一个共同特点就是推行洗脑和愚民政策. 经典台 ...

  9. 数字信号处理实验(六)——FIR滤波器的设计

    一.四种线性相位FIR滤波器的振幅响应 1.自编函数 [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) [Hr,w,a,L]=-n) 2.一个demo clea ...

  10. ontouchstart

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta cont ...