SYZOJ 186 [额]你猜是不是DP(哈希+二分答案+二分搜索)
题目描述
现在给两个仅包含小写字母的字符串a,b ,求a 与b的最长公共连续子串的长度。
输入格式
两个字符串
输出格式
一个整数,为输入的两个字符串的最长公共连续子串的长度
测试样例
输入
qaqaaaq
qqaqa
输出
4
解释
最长连续公共子串为qaqa,长度为4
数据范围与提示
20 组测试数据
对于20%的数据,a,b长度 ∈ [1, 200]
对于50%的数据,a,b长度 ∈ [1, 20000]
对于100%的数据, a,b长度 ∈ [1, 200000]
题目链接:SYZOJ 186
哈希第一题,预处理出前缀hash值后二分答案,这里需要用二分优化,把第一个和第二个字符串的所有以mid为长度的区间哈希值储存并对后者排序,那么只要遍历第一个字符串的区间哈希值的时候二分查找第二段是否存在同样的哈希值即可。若二分+双for循环遍历的复杂度$O(logN*N^2)$只有85分会超时,改成二分搜索复杂度就成了$O(logN*NlogN)$就不会超时了,突然发现哈希有时候是个神器,只是写起来有点麻烦而且对于hash killer这种题目就比较尴尬了
代码:
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
typedef unsigned long long ULL;
const double PI = acos(-1.0);
const int N = 200010;
const ULL seed = 1e9 + 7;
ULL prefix[N], pa[N], pb[N], ha[N], hb[N];
char a[N], b[N];
ULL vec[N]; void init()
{
prefix[0] = 1ull;
for (int i = 1; i < N; ++i)
prefix[i] = prefix[i - 1] * seed;
}
int main(void)
{
int i, j;
init();
while (~scanf("%s%s", a + 1, b + 1))
{
int la = strlen(a + 1);
int lb = strlen(b + 1);
pa[0] = pb[0] = 0;
for (i = 1; i <= la; ++i)
pa[i] = pa[i - 1] * seed + a[i];
for (i = 1; i <= lb; ++i)
pb[i] = pb[i - 1] * seed + b[i];
int ans = 0, L = 0, R = min(la, lb);
while (L <= R)
{
int mid = (L + R) >> 1;
int flag = 0;
int sa = 0, sb = 0;
for (i = mid; i <= la; ++i)
ha[sa++] = pa[i] - pa[i - mid] * prefix[mid];
for (i = mid; i <= lb; ++i)
hb[sb++] = pb[i] - pb[i - mid] * prefix[mid];
sort(hb, hb + sb);
for (i = 0; i < sa; ++i)
{
if (binary_search(hb, hb + sb, ha[i]))
{
flag = 1;
break;
}
}
if (flag)
{
ans = mid;
L = mid + 1;
}
else
R = mid - 1;
}
printf("%d\n", ans);
}
return 0;
}
SYZOJ 186 [额]你猜是不是DP(哈希+二分答案+二分搜索)的更多相关文章
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- [BJOI2019]奥术神杖——AC自动机+DP+分数规划+二分答案
题目链接: [BJOI2019]奥术神杖 答案是$ans=\sqrt[c]{\prod_{i=1}^{c}v_{i}}=(\prod_{i=1}^{c}v_{i})^{\frac{1}{c}}$. 这 ...
- bzoj 3507 DP+哈希
[Cqoi2014]通配符匹配 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 541 Solved: 235[Submit][Status][Dis ...
- 【CodeForces】961 F. k-substrings 字符串哈希+二分
[题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...
- [CF752E]Santa Claus and Tangerines(二分答案,dp)
题目链接:http://codeforces.com/contest/752/problem/E 题意:给n个橘子,每个橘子a(i)片,要分给k个人,问每个人最多分多少片.每个橘子每次对半分,偶数的话 ...
- 【61测试】【dp】【二分】【前缀和】【树剖】
不要问我为什么昨天考的今天才贴解题报告.. 第一题: 给定3个字符串,求它们的最长公共子序列. 解: 考试时知道肯定是LCS的二维再加一维,用三维,可天堂有路你不走,地狱无门你偏来...灵机一动想出来 ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- HDU 3586 二分答案+树形DP判定
HDU 3586 『Link』HDU 3586 『Type』二分答案+树形DP判定 ✡Problem: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏 ...
- BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...
随机推荐
- 更改yum网易、阿里云的yum源
更改yum源为网易的. 首先备份/etc/yum.repos.d/CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...
- 绘制三角形:imageline()
<?php //1. 绘制图像资源(创建一个画布) $image = imagecreatetruecolor(500, 300); //2. 先分配一个绿色 $green = imagecol ...
- 【python学习】新手基础程序练习(二)
Ι 继续上一节得内容,这里主要是对各种知识的理解以及如何运用. 一.执行 Python 脚本的两种方式 1.把python执行文件加到计算机的环境变量中,然后新建文件把程序写在新文件里,再通过cmd命 ...
- Python3中的列表用法,看这一篇就够了
类似C语言中的列表用法 ---------------------------------------------------------------------------------------- ...
- Python9-IO模型-day41
# 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...
- NAND Flash和NOR Flash的比较
目前Flash主要有两种NOR Flash和NADN Flash.NOR Flash的读取和我们常见的SDRAM的读取是一样,用户可以直接运行装载在NOR FLASH里面的代码,这样可以减少SRAM的 ...
- 教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
摘录 文章主要是介绍了通过一个第三方类库RazorJS,实现Javascript 文件里使用 .Net MVC Razor 语法,很巧妙,推荐给大家 相信大家都试过在一个 View 里嵌套使用 jav ...
- billard:桌球的走位路线图解
这些是桌球的一些基础知识,记得刚学会桌球那会儿很强烈的想找到类似图片或资料,好久都找不到,最严重的时候只要一闭上眼睛,满脑子就是桌球的路线,线路图几乎是无处不在,痛苦的是经常能理解过来的很多路线因为杆 ...
- lua table长度解析
先来看lua table源码长度获取部分(ltable.c) j是数组部分的长度.首先判断数组长度大于0,并且数组最后一个是nil,就用二分法查找,返回长度. 如果t->node是 table的 ...
- Codeforces 664D Graph Coloring 二分图染色
题意: 一个无向图的每条边为红色或蓝色,有这样一种操作:每次选一个点,使与其相邻的所有边的颜色翻转. 求解是否可以经过一系列操作使所有的边颜色相同,并输出最少操作次数和相应的点. 分析: 每个点要么选 ...