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开发中,难免会遇到需要加解密一些数据内 ...
随机推荐
- Unity5 AssetBundle系列——简单的AssetBundleManager
一个AssetBundle同时只能加载一次,所以实际使用中一般会伴随着AssetBundle包的管理. 下面是一个简单的AssetBundle管理器,提供了同步和异步加载函数: using Unity ...
- NLog使用
NLog的配置文件,文件上面有详细的备注,注意这个配置文件一定要放在NLog.dll的文件夹里 <?xml version="1.0" encoding="utf- ...
- AD域部署使用bginfo软件
实验网络拓扑图: 实验目标: bginfo收集信息服务器通过bginfo软件收集每个域客户端信息录入到SQL server 2008数据库 bginfo软件官网下载地址: https://docs.m ...
- [Full-stack] 跨平台大框架 - RN
前言 React-Redux的大全栈代码复用理论有点意思,给出一个具体的例子:[React] 15 - Redux: practice IM 因为与react内容天然地部分重合,故这里将重点放在了对c ...
- actor 内最好不要阻塞
1. 在使用 akka cluster singleton 时,我需要知道被创建的 singleton proxy 的 actorRef,通过绝对路径加 actorSelection 方法,应该很容易 ...
- linux下mysql 文件导入导出
最近在做mysql的数据导入导出得到的一些经验,记录下. 1.首先要开通导入导出的功能,需要设置一个mysql的配置 可以在 my.conf 文件的最后增加配置项 secure-file-priv=' ...
- Linux设备驱动剖析之Input(二)
分别是总线类型.厂商号.产品号和版本号. 1156行,evbit,设备支持的事件类型的位图,每一位代表一种事件,比如EV_KEY.EV_REL事件等等.BITS_TO_LONGS(nr)是一个宏,假设 ...
- xrdp完美实现Windows远程访问Ubuntu 16.04
前言: 在很多场景下,我们需要远程连接到Linux服务器(本文是Ubuntu),传统的连接主要分为两种. 第一种:通过SSH服务(使用xshell等工具)来远程访问,编写终端命令,不过这个是无界面的, ...
- 【BZOJ5210】最大连通子块和 树剖线段树+动态DP
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...
- 如何利用office绘制施工进度计划横道图?
在Excel中利用“悬浮的条形图”可以制作简单的横道图.Step1 启动Excel,仿照图1的格式,制作一份表格,并将有关工序名称.开(完)工时间和工程持续时间等数据填入表格中. A1单元格中请不要输 ...