看大神代码,发现上交大神很棒的一个思路

题意:

在源数字串中找出尽量多的连续子串,要求子串任意两值的大小关系与目标串相同位置的值的大小关系相同。求源串能拿出的子串的最大数量。

关键词:

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的更多相关文章

  1. HDU 4749 Parade Show(暴力水果)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 Problem Description   2013 is the 60 anniversary ...

  2. HDU 4749 Parade Show 2013 ACM/ICPC Asia Regional Nanjing Online

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题目大意:给一个原序列N,再给出一个序列M,问从N中一共可以找出多少个长度为m的序列,序列中的数 ...

  3. HDU 4749 Parade Show(贪心+kmp)

    题目链接 题目都看不懂,做毛线...看懂了之后就是kmp出,所有的匹配区间,然后DP可以写,贪心也可以做把,DP应该需要优化一下,直接贪,也应该对的,经典贪心问题. #include<iostr ...

  4. 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 ...

  5. HDOJ 4749 Parade Show

    说实在的在比赛时看错了题意,一直对最后一段的描述不是很清楚.闲话少说: 题意:给一个主串,再一个副串,问主串中有多少个子串和副串的的规律相同,即相邻的相等大于小于,用过的就不能再用了. #includ ...

  6. hdu 4749

    题目很简单,不过题意很难看懂. 就是给一个标准的大小关系的队列,从原队列中找出最多的匹配子队列,感觉就像一个KMP算法+贪心: 不过这个题可能数据有点水把,竟然只要判断相邻的关系就可以A掉: 代码: ...

  7. hdu 5972 Regular Number 字符串Shift-And算法 + bitset

    题目链接 题意 给定两个串\(S,T\),找出\(S\)中所有与\(T\)匹配的子串. 这里,\(T\)的每位上可以有若干(\(\leq 10\))种选择,匹配的含义是:对于\(S\)的子串的每一位, ...

  8. luogu 2463 [SDOI2008]Sandy的卡片 kmp || 后缀数组 n个串的最长公共子串

    题目链接 Description 给出\(n\)个序列.找出这\(n\)个序列的最长相同子串. 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串. 思路 参考:hzwe ...

  9. 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 ...

随机推荐

  1. loj6485 LJJ 学二项式定理

    题目描述: loj 题解: 单位根反演. $[n|x]=\frac{1}{n} \sum _{i=0}^{n-1} (ω_n^x)^i$ 证明?显然啊,要么停在$(1,0)$要么转一圈. 所以说题目要 ...

  2. 【差分约束】poj1275Cashier Employment

    比较经典的差分约束 Description A supermarket in Tehran is open 24 hours a day every day and needs a number of ...

  3. $GLOBALS['HTTP_RAW_POST_DATA']与$_POST的区别

    $HTTP_RAW_POST_DATA   The RAW / uninterpreted HTTP POst information can be accessed with:   $GLOBALS ...

  4. 请问batch_normalization做了normalization后为什么要变回来?

    请问batch_normalization做了normalization后为什么要变回来? 请问batch_normalization做了normalization后为什么要变回来? - 莫驚蟄的回答 ...

  5. linux下安装mysql并设置远程连接

    腾讯云环境为Centos7.4   mysql版本为5.6 本次安装使用yum安装 检查是否已有mysql: yum list installed | grep mysql 下载yum源文件: wge ...

  6. Liunx将私密代理添加到环境变量

    .bash_profile文件存在于用户主目录下,绝对路径为/home/$name/.bash_profile.bash_profile文件是隐藏文件,里面包含的是用户的用户的环境变量. 注意: 这个 ...

  7. vmware esxi 6.0 开启嵌套虚拟化

    环境描述: 已通过vSphere Client创建一个名字为centos7的虚拟机,现在需要打开该虚拟机的嵌套虚拟化功能. 第一步: 开启ESXi Shell 开启vSphere的ssh远程登录服务或 ...

  8. 评估后Vista时代系统内核模式安全性

    Windows Vista与之前的MS Windows版本(包括WindowsXPSP2)相比增加了很多的安全性.Vista新安全性的特征可以包括以下几个方面: 驱动签名 路径保护 内核模式代码完整性 ...

  9. Java-一个数组中的元素复制到另一个数组

    public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length).其中五个参数分别表示为: ...

  10. windows :Tomcat免安装版环境变量配置 + jdk配置

    1.  下载后解压,我解压的目录为:D:\Tomcat\apache-tomcat-9.0.1-windows-x64 2.  安装jdk和jre, 并配置环境变量: 2.1 用户变量新建JAVA_H ...