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

题意:

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

关键词:

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. Golang 简单静态web服务器

    直接使用 net.http 包,非常方便 // staticWeb package main import ( "fmt" "net/http" "s ...

  2. centos7 rpm安装mysql5.7

    1.去官网下载指定的数据库版本:https://dev.mysql.com/downloads/mysql/ 2.根据所用的操作系统下载指定的rpm包 3.下载及安装 地址链接wget https:/ ...

  3. python入门:输出1-10的所有数

    #!/usr/bin/env python # -*- coding:utf-8 -*- #输出1-10的所有数 """ 变量kaishi的赋值为数字1,while 真, ...

  4. 动态设置html的title

    使用vue前端框架做,竟然丢弃了很多javascript和html的东西了..动态设置title的方法: 1.使用vue的自定义指令 <div v-title>{{htmltitle}}& ...

  5. 装逼图片旋转合成demo

    测试背景 bg.jpg 测试图片 a.jpg 结果示例 代码demo <?php $bgImgFileName = 'bg.jpg'; $a = 'a.jpg'; // 初始化 $src = i ...

  6. pandas-Notes2

    #coding = utf-8 import pandas as pd import numpy as np import matplotlib as plt dates = pd.date_rang ...

  7. LeetCode(226)Invert Binary Tree

    题目 分析 交换二叉树的左右子树. 递归非递归两种方法实现. AC代码 class Solution { public: //递归实现 TreeNode* invertTree(TreeNode* r ...

  8. POJ:1094-Sorting It All Out(拓扑排序经典题型)

    Sorting It All Out Time Limit: 1000MS Memory Limit: 10000K Description An ascending sorted sequence ...

  9. 数据结构和算法(What Why How)

    数据结构和算法是什么? 从广义上讲,数据结构就是指一组数据的存储结构.算法就是操作数据的一组方法. 从狭义上讲,是指某些著名的数据结构和算法,比如队列.堆.栈.二分查找.动态规划等. 数据结构和算法有 ...

  10. Python虚拟机函数机制之位置参数(四)

    位置参数的传递 前面我们已经分析了无参函数的调用过程,我们来看看Python是如何来实现带参函数的调用的.其实,基本的调用流程与无参函数一样,而不同的是,在调用带参函数时,Python虚拟机必须传递参 ...