HDU 4749: Parade Show
看大神代码,发现上交大神很棒的一个思路
题意:
在源数字串中找出尽量多的连续子串,要求子串任意两值的大小关系与目标串相同位置的值的大小关系相同。求源串能拿出的子串的最大数量。
关键词:
RK-Hash
优点:
O(k)时间完成匹配检查(关键在于他能O(1) 完成 所有 相同位 检查)
方法:
对于一个K值,用某个进制数来表示其位置。
比如 123121 中 的值 1 最后表示成 100101。
然后,对于目标串也RK-hash,对于某个值,只要比较这个数,就能知道是否相同位都相同了。
代码留恋:
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; const int N = , K = ;
int a[N], b[N], n, m, k;
unsigned long long phs[K], ahs[K], DEF; const unsigned long long base = ; int main() {
while (scanf("%d%d%d", &n, &m, &k) == ) {
for (int i = ; i < n; ++i) {
scanf("%d", a + i);
}
for (int i = ; i < m; ++i) {
scanf("%d", b + i);
}
DEF = ;
for (int i = ; i < m - ; ++i) {
DEF *= base;
}
memset(phs, , sizeof(phs));
memset(ahs, , sizeof(ahs));
for (int i = ; i < m; ++i) {
for (int j = ; j < k; ++j) {
phs[j] *= base;
}
phs[b[i] - ] += ;
}
vector<int> v;
for (int i = ; i < n; ++i) {
for (int j = ; j < k; ++j) {
ahs[j] *= base;
}
ahs[a[i] - ] += ;
if (i >= m - ) {
int t1 = k - , t2 = k - ;
bool sue = false;
while (true) {
while (t1 >= && ahs[t1] == ) {
--t1;
}
while (t2 >= && phs[t2] == ) {
--t2;
}
if (t1 == - && t2 == -) {
sue = true;
break;
}
if (t1 == - || t2 == -) {
break;
}
if (ahs[t1] != phs[t2]) {
break;
}
--t1, --t2;
}
if (sue) {
v.push_back(i - m + );
}
ahs[a[i - m + ] - ] -= DEF;
}
}
int last = -m - , ans = ;
for (int i = ; i < (int)v.size(); ++i) {
if (v[i] < last + m) {
continue;
} else {
last = v[i];
++ans;
}
}
printf("%d\n", ans);
}
return ;
}
HDU 4749: Parade Show的更多相关文章
- HDU 4749 Parade Show(暴力水果)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 Problem Description 2013 is the 60 anniversary ...
- HDU 4749 Parade Show 2013 ACM/ICPC Asia Regional Nanjing Online
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目大意:给一个原序列N,再给出一个序列M,问从N中一共可以找出多少个长度为m的序列,序列中的数 ...
- HDU 4749 Parade Show(贪心+kmp)
题目链接 题目都看不懂,做毛线...看懂了之后就是kmp出,所有的匹配区间,然后DP可以写,贪心也可以做把,DP应该需要优化一下,直接贪,也应该对的,经典贪心问题. #include<iostr ...
- HDU 2490 Parade(DPの单调队列)(2008 Asia Regional Beijing)
Description Panagola, The Lord of city F likes to parade very much. He always inspects his city in h ...
- HDOJ 4749 Parade Show
说实在的在比赛时看错了题意,一直对最后一段的描述不是很清楚.闲话少说: 题意:给一个主串,再一个副串,问主串中有多少个子串和副串的的规律相同,即相邻的相等大于小于,用过的就不能再用了. #includ ...
- hdu 4749
题目很简单,不过题意很难看懂. 就是给一个标准的大小关系的队列,从原队列中找出最多的匹配子队列,感觉就像一个KMP算法+贪心: 不过这个题可能数据有点水把,竟然只要判断相邻的关系就可以A掉: 代码: ...
- hdu 5972 Regular Number 字符串Shift-And算法 + bitset
题目链接 题意 给定两个串\(S,T\),找出\(S\)中所有与\(T\)匹配的子串. 这里,\(T\)的每位上可以有若干(\(\leq 10\))种选择,匹配的含义是:对于\(S\)的子串的每一位, ...
- luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串
题目链接 Description 给出\(n\)个序列.找出这\(n\)个序列的最长相同子串. 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串. 思路 参考:hzwe ...
- HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配)
HDU 2389 Rain on your Parade / HUST 1164 4 Rain on your Parade(二分图的最大匹配) Description You're giving a ...
随机推荐
- deque 用法
引用博客:https://blog.csdn.net/zyq522376829/article/details/46801973 下面是那位大佬写的的笔记整理~~~~ deque - 双向队列 1.构 ...
- Mycat高可用解决方案二(主从复制)
Mycat高可用解决方案二(主从复制) 系统部署规划 名称 IP 主机名称 用户名/密码 配置 mysql主节点 192.168.199.110 mysql-01 root/hadoop 2核/2G ...
- Spring AOP注解形式简单实现
实现步骤: 1:导入类扫描的注解解析器 命名空间:xmlns:context="http://www.springframework.org/schema/context" xsi ...
- 基于网站地址URL传输session信息
在php的学习中,会话是我们常常用到的,那今天我们就来详细讲讲会话中的session: 一.session的工作机制:当开启session后,服务器会在服务器中保存session文件,然后再浏览器保存 ...
- OpenCV中的图像形态学转换
两个基本的形态学操作是腐蚀和膨胀.他们的变化构成了开运算,闭运算,梯度等.下面以这张图为例 1.腐蚀 这个操作会把前景物体的边界腐蚀掉. import cv2 import numpy as np i ...
- Find a way HDU - 2612(bfs)
Find a way Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 制作iso文件
genisoimage -o fusionstor-yi-2017-03-08.iso(镜像名称) -v -cache-inodes -joliet-long -R -J -T -V ZS -c ...
- bash循环for/while/until
shell流程控制之一:for循环 for VAR in LIST; do STATEMENT1 ... done 例: ...
- MySQL-状态Waiting on empty queue引申
MySQL 事件调度器示例演示 我们大家都知道MySQL 事件调度器是在 MySQL 5.1 中新生的一个较为特殊的功能,其可以作为定时任务调度器,来取代部分原先只能用操作系统任务调度器才能完成的定时 ...
- MySQL主从复制(Master-Slave)
MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展.多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能. 下图就描述了一个多个数 ...