【poj2774】 Long Long Message

[http://poj.org/problem?id=2774] (题目链接)

第一次用后缀数组,感觉有点神。。。才发现原来sa[0]是没用的。。

题意:给出两个只包含小写字母的字符串,求出最长连续公共子串。

solution 
  将两个字符串合并为一个,并用分隔符隔开。之后跑后缀数组,求出height[],for一遍,找到在分隔符两侧的height值最大的便是答案。

代码:

// poj2774
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

const int maxn=1000010;
char s[maxn],s1[maxn];
int wa[maxn],wb[maxn],w[maxn],wv[maxn],sa[maxn],rank[maxn],height[maxn];

bool cmp(int *r,int a,int b,int l) {return r[a]==r[b] && r[a+l]==r[b+l];}
void da(char *r,int *sa,int n,int m) {
    int i,j,p,*x=wa,*y=wb,*t;
    for (i=0;i<m;i++) w[i]=0;
    for (i=0;i<n;i++) w[x[i]=r[i]]++;
    for (i=1;i<m;i++) w[i]+=w[i-1];
    for (i=n-1;i>=0;i--) sa[--w[x[i]]]=i;
    for (p=1,j=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++) w[i]=0;
        for (i=0;i<n;i++) w[wv[i]]++;
        for (i=1;i<m;i++) w[i]+=w[i-1];
        for (i=n-1;i>=0;i--) sa[--w[wv[i]]]=y[i];
        for (p=1,t=x,x=y,y=t,x[sa[0]]=0,i=1;i<n;i++)
            x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    }
    sa[0]=0;
}
void calheight(char *r,int *sa,int n) {
    for (int i=1;i<=n;i++) rank[sa[i]]=i;
    int k=0;
    for (int i=0;i<n;height[rank[i++]]=k) {
        k?k--:0;
        for (int j=sa[rank[i]-1];r[i+k]==r[j+k];k++);
    }
}
int main() {
    //free("aaa");
    scanf("%s%s",s,s1);
    int n=strlen(s);
    int n1=strlen(s1);
    s[n++]=‘0‘;
    for (int i=0;i<n1;i++) s[n+i]=s1[i];
    int l=n-1;
    n+=n1;
    s[n]=‘#‘;
    da(s,sa,n+1,200);
    calheight(s,sa,n);
    int ans=0;
    for (int i=2;i<=n;i++)
        if ((sa[i-1]<l && sa[i]>l) || (sa[i-1]>l && sa[i]<l)) ans=max(ans,height[i]);
    printf("%d",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

  

时间: 2024-08-01 23:21:28

【poj2774】 Long Long Message的相关文章

【POJ2774】Long Long Message(后缀数组)

[POJ2774]Long Long Message(后缀数组) 题面 Vjudge Description Little cat在Byterland的首都读物理专业.这些天他收到了一条悲伤地信息:他的母亲生病了.担心买火车票花钱太多(Byterland是一个巨大的国家,因此他坐火车回家需要16小时),他决定只给母亲发短信. Little cat的家境并不富裕,因此他经常去营业厅查看自己发短信花了多少钱.昨天营业厅的电脑坏掉了,打印出两条很长的信息.机智的little cat很快发现: 1.信息

【POJ2774】Long Long Message 后缀自动机

--另一道题用到,想看看部分代码对不对.于是又拿SAM交了一遍此题. 仅贴代码. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101000 #define T 30 using namespace std; char s[N],t[N]; int pa[N<<1],son[N<<1][T]; int de

【POJ2774】Long Long Message (SA)

最长公共子串...两个字符串连在一起,中间放一个特殊字符隔开.求出height之后,枚举height,看两个后缀是不是分布于两段字符串..如果是,这个值就可以作为答案.取最大值即可. 1 const maxn=200419; 2 var 3 c,h,rank,sa,x,y:array[0..maxn] of longint; 4 n,k:longint; 5 s:ansistring; 6 7 function max(x,y:longint):longint; begin if x>y the

laravel 【error】MethodNotAllowedHttpException No message

Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException No message 报错原因[原理]CSRF防护: 在 web 路由文件中所有请求方式为PUT.POST或DELETE的HTML表单都会包含一个CSRF令牌字段,否则,请求会被拒绝 解决办法: 在html表单提交中加入: {{csrf_field()}}或者 <input type="hidden" name="_t

【JAVASCRIPT】获取触发MESSAGE事件的源IFRAME

先让发送源获取焦点,然后获取焦点元素. window.addEventListener('message',function(msg){ //做一些事来判断是不是某个iframe发送的消息 msg.source.focus(); var sourceFrame=document.activeElement; }); 如果不想影响焦点的话,可以遍历一遍所有的iframe function findIframe(win){ var fs=document.querySelectorAll('ifra

【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战

前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同时用MINA2和Netty4分别实现服务端的目的,是因为很多人都在纠结到底是用MINA还是Netty来实现高并发的Java网络通信服务端,在此干脆两个都实现了,就看你怎么选择了,够吊吧. NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,M

BeanShell用法汇总(部分摘抄至网络)【转】

说明:本文部分资料摘抄至 来源: http://www.cnblogs.com/puresoul/p/4915350.html 来源: http://www.cnblogs.com/puresoul/p/4949889.html 来源: http://blog.csdn.net/silencemylove/article/details/51373873 一.什么是Bean Shell BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法; BeanShel

【小随笔】Android中Message的创建——New Message与Handle#obtainMessage()

private void TestHandlerMessage(){ Message msg = new Message(); msg.what = 1; handler.sendMessage(msg); } 在很多Android工具书上,经常出现与上面代码相似的片段. 而在真正接触项目,需要对性能有更好把握的时候又能看到这样的代码段: private void obtainMessageTest(){ Message msg = handler.obtainMessage(); msg.wh

【bugRecord2】selenium.common.exceptions.WebDriverException: Message: &#39;geckodriver&#39; executable needs to be in PATH.

环境信息:Windows7 64位 + python 3.6.5 + selenium 3.11.0 +pyCharm 1 #coding=utf-8 2 from selenium import webdriver 3 driver=webdriver.Firefox() 解决方法: 1.下载geckodriver,路径:https://github.com/mozilla/geckodriver/releases 2.解压后无需安装,将其解压路径配置到环境变量PATH [bugRecord2