POJ2274 Long Long Message 字符串
正解:SA/哈希+二分
解题报告:
啊先放下翻译,,,?大意就有两个字符串,求这两个字符串的最长公共子串
先港SA的做法趴
就把两个子串拼接起来,然后题目就变成了求后缀的最长公共前缀了
所以就跑一下SA的模板就欧克了
只是注意两个细节,,,
一个是因为要求的是两个字符串的最长公共子串,所以要判断一下确保两个子串并不都属于一个串中的
另一个是拼起来的时候要在中间加个特殊字符比如'#'这种的,原因很显然?或者放个hack数据也许更好理解趴QAQ
aaaab
bbbbb
如果不加答案就会是5,然而显然答案是1,自己意会下就好
然后说下二分+哈希
就直接二分一个长度鸭,然后把所有这个长度的找出来,哈希一下,判断是否有相同的就好
具体就先把第一个串的这个长度的串哈希了,然后对第二个串一个个做,每算出一个子串的哈希值就二分查找下
然后get了一个二分查找的函数,,,binary_search
(其实可以直接用lower_bound然后判是否相等来着hhhhh
二分+哈希的代码我没打,,,只写了个SA的就只放SA的代码了QAQ?
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
#define il inline
#define gc getchar()
#define ll long long
#define ull unsigned ll
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=;
int sa[N],x[N],y[N],t[N],n,rk[N],hei[N],str[N],n1,n2,as;
char ch[N]; il bool check(ri gd,ri gs,ri k){return y[gd]==y[gs] && y[gd+k]==y[gs+k];}
il bool jud(ri gd,ri gs){return (gd<=n1 && gs>n1) || (gs<=n1 && gd>n1);}
il void SA()
{
ri m=;
rp(i,,n)++t[x[i]=str[i]];
rp(i,,m)t[i]+=t[i-];
my(i,n,)sa[t[x[i]]--]=i;
for(ri k=;k<=n;k<<=)
{
ri p=;
rp(i,,m)t[i]=;rp(i,,n)y[i]=;
rp(i,n-k+,n)y[++p]=i;
rp(i,,n)if(sa[i]>k)y[++p]=sa[i]-k;
rp(i,,n)++t[x[y[i]]];
rp(i,,m)t[i]+=t[i-];
my(i,n,)sa[t[x[y[i]]]--]=y[i];
swap(x,y);
x[sa[]]=p=;
rp(i,,n)x[sa[i]]=check(sa[i],sa[i-],k)?p:++p;
if(p>=n)break;
m=p;
}
rp(i,,n)rk[sa[i]]=i;
ri h=;
rp(i,,n)
{
if(h)--h;
while(str[i+h]==str[sa[rk[i]-]+h])++h;
hei[rk[i]]=h;
}
} int main()
{
// freopen("2774.in","r",stdin);freopen("2774.out","w",stdout);
scanf("%s",ch+);n1=strlen(ch+);rp(i,,n1)str[++n]=ch[i]-'a'+;str[++n]='#';
scanf("%s",ch+);n2=strlen(ch+);rp(i,,n2)str[++n]=ch[i]-'a'+;
SA();
rp(i,,n)if(jud(sa[i-],sa[i]))as=max(as,hei[i]);
printf("%d\n",as);
return ;
}
/*
memcpy比swap快,,,mk
*/
这儿是代码QAQ
POJ2274 Long Long Message 字符串的更多相关文章
- node.js 监听message事件 message字符串丢失信息
const dgram = require("dgram"); const server = dgram.createSocket("udp4"); serve ...
- Clairewd's message /// 字符串hash
题目大意: 给定字符串s 是26个字母对应的密文字母 给定字符串c1 是 密文+部分原文 原文可能缺损 要求将原文补全输出 利用s得到密文字母对应的原字母rs 利用rs翻译c1得到 原文+部分密文c2 ...
- hdu 4300 Clairewd’s message 字符串哈希
Clairewd’s message Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- poj 2041 Unreliable Message 字符串处理
水的问题.直接附着到代码. //poj 2041 //sep9 #include <iostream> using namespace std; char mode[128]; char ...
- C# 字符串加密解密方法
这个是加密的算法的命名空间,使用加密算法前要引用该程序集 System.Security.Cryptography using System;using System.Data;using Syst ...
- python开发_python中字符串string操作
在python中,对于字符串string的操作,我们有必要了解一下,这样在我们的以后的开发中会给我们带来很多方便 下面是我学习的笔记: #python-string #python中的字符串用单引号' ...
- JavaScript中字符串类型
字符串类型 字符串介绍 这是程序里面使用最为广泛的一-种类型.在JavaScript里面, 可以使用单引号,也可以使用双引号: 字符串这种数据类型非常霸道,它和其他数据类型相加都会被转换后才为字符串类 ...
- ASP.NET MVC 5 05 - 视图
PS: 唉,这篇随笔国庆(2015年)放假前几天开始的,放完假回来正好又赶上年底,公司各种破事儿. 这尼玛都写跨年了都,真服了.(=_=#) 好几次不想写了都. 可是又不想浪费这么多,狠不下心删除.没 ...
- Android应用安全开发之浅谈加密算法的坑
<Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题 Android开发中,难免会遇到需要加解密一些数据内 ...
随机推荐
- mysql中update+select
mysql中不支持嵌套查询后更新操作. 但是可以使用inner join来解决自身的更新问题,参考如下例子: update hera_job a inner join( ),'"') as ...
- Envoy 代替nginx https://www.jianshu.com/p/0a1f67b42fdb
官方文档: https://www.envoyproxy.io/docs1.6.0版官方文档: https://www.envoyproxy.io/docs/envoy/v1.6.0/ 一. 编译和安 ...
- Java知多少(41)泛型详解
我们知道,使用变量之前要定义,定义一个变量时必须要指明它的数据类型,什么样的数据类型赋给什么样的值. 假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数.小数和字符串,例如: x = 1 ...
- c++ 动态判断基类指针指向的子类类型(typeid)
我们在程序中定义了一个基类,该基类有n个子类,为了方便,我们经常定义一个基类的指针数组,数组中的每一项指向都指向一个子类,那么在程序中我们如何判断这些基类指针是指向哪个子类呢? 本文提供了两种方法 ( ...
- 记录一次在安装双系统的过程(先有debian, 后加windows 8.1)
突破的难题: 如何在一整个根目录的分区中切出来一半用于安装windows8.1呢? 当初安装debian系统时, 由于脑残,直接把整个500G的硬盘分给了根目录 / ,所以整个磁盘就TMD的一个主 ...
- thinkphp5 memcached 安装、调用、链接
环境 linux memcached1.5.9 (memcached安装在虚拟机192.168.70.164) wampserver集成环境 thinkphp5 php7 步骤一:linux安装me ...
- [BOOK] Applied Math and Machine Learning Basics
<Deep Learning> Ian Goodfellow Yoshua Bengio Aaron Courvill 关于此书Part One重难点的个人阅读笔记. 2.7 Eigend ...
- [JS] Topic - Object.create vs new
故事背景 Ref: 你不知道的javascript之Object.create 和new区别 var Base = function () {} (1) var o1 = new Base(); (2 ...
- [Laravel] 04 - Blade templates
前言 一.大纲 From: https://www.imooc.com/video/12509 Blade视图页面 --> 编译 --> 原生PHP --> 并缓存起来. 既然是个模 ...
- [原]Jenkins(十)---jenkins注册管理员admin并赋所有权限给admin
/** * lihaibo * 文章内容都是根据自己工作情况实践得出. * 版权声明:本博客欢迎转发,但请保留原作者信息! http://www.cnblogs.com/horizonli/p/533 ...