HDU 4749 & POJ 3167 kmp变形

23、微波电路中的过孔、过孔围栏与接地焊盘建模分析 本文详细分析了微波电路设计中过孔、过孔围栏及接地焊盘的建模与优化方法。探讨了过孔模型的发展及其电感与电容特性,通过场求解器和集总元件模型提高建模精度。此外,分析了过孔隔离围栏在改善信号隔离中的作用,并通过2.5D和3D电磁仿真验证其效果。最后,研究了接地焊盘中过孔布局对电路稳定性的影响,提出了优化过孔位置以消除谐振和杂散振荡的方法。文章为微波电路设计提供了重要的理论支持和实践指导。 阅读详情

HDU4749

题意

给定一个主串 T 和模式串 P,问 T 有多少个不重合的子串与 P 匹配。

在这里,串 a 与串 b 匹配的含义是,

∀i,j,1≤i,j≤n,⎧⎩⎨a[i]<a[j]↔b[i]<b[j]a[i]==a[j]↔b[i]==b[j]a[i]>a[j]↔b[i]>b[j]

参考

HDU 4749 && POJ 3167 KMP ——九野的博客

思路

最原始的匹配含义是两字符相同,因此比较时即比较 T[i]==P[j] ,现今改了匹配的含义,只需要对应的去修改比较方式即可。

那么怎么 check 当前的 T[i] 与 P[j] 是否匹配呢?只需检查前面已经匹配成功的一段中分别比 T[i] 小的和比 P[j] 小的数的数量是否相同,以及相等的是否相同。

求失配数组也是同理。

因为 K 的范围只有 25,所以可以直接暴力预处理记录下 eq[i][j] 与 lt[i][j] ,分别意为在第 i 个位置及以前与 j 相等的或者比 j 小的有多少个。

那么不重合的子串这个要求呢?我们可以贪心地去匹配,如果当前这段可行,就一定匹配上这段。否则,开始的位置更迟只会消耗掉之后其他子串进行匹配的可能性。一旦匹配上了,就再从模式串的开始位置进行匹配。

这道题要注意的问题是下标的问题,稍微有点绕;kmp 也不是最常规的那种写法。

是道好题。

Code

#include <bits/stdc++.h>
#define K 25
#define maxn 100010
using namespace std;
typedef long long LL;
int n, m, k;
int eq1[maxn][K+10], eq2[maxn][K+10], lt1[maxn][K+10], lt2[maxn][K+10], f[maxn], x[maxn], a[maxn];
bool cmp(int i, int j) { return x[i] < x[j]; }
void init(int* x, int eq[maxn][K+10], int lt[maxn][K+10], int n) {
    for (int i = 1; i <= n; ++i) {
        memcpy(eq[i], eq[i-1], sizeof(eq[0]));
        ++eq[i][x[i]];
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= K; ++j) lt[i][j] = lt[i][j-1] + eq[i][j];
    }
}
bool match1(int i, int j, int x, int y) {
    return eq2[i][x] - eq2[i-j][x] == eq2[j][y] && lt2[i][x-1] - lt2[i-j][x-1] == lt2[j][y-1];
}
bool match2(int i, int j, int x, int y) {
    return eq1[i][x] - eq1[i-j][x] == eq2[j][y] && lt1[i][x-1] - lt1[i-j][x-1] == lt2[j][y-1];
}
void getfail(int* P) {
    int j = 0; f[1] = 0;
    for (int i = 1; i <= m; ) {
        if (!j || match1(i, j, P[i], P[j])) f[++i] = ++j;
        else j = f[j];
    }
}
int cnt;
void kmp(int* T, int* P) {
    int j = 1;
    for (int i = 0; i <= n; ) {
        if (!j || match2(i, j, T[i], P[j])) ++j, ++i;
        else j = f[j];
        if (j == m + 1) ++cnt, j = 1;
    }
}
void init() {
    memset(x, 0, sizeof(x)); memset(a, 0, sizeof(a)); memset(f, 0, sizeof(f));
    memset(eq1, 0, sizeof eq1); memset(eq2, 0, sizeof eq2);
    memset(lt1, 0, sizeof lt1); memset(lt2, 0, sizeof lt2);
}
void work() {
    init();
    for (int i = 1; i <= n; ++i) scanf("%d", &x[i]); init(x, eq1, lt1, n);
    for (int i = 1; i <= m; ++i) scanf("%d", &a[i]); init(a, eq2, lt2, m);
    getfail(a);
    int cur = 1, p; cnt = 0;
    kmp(x, a);
    printf("%d\n", cnt);
}
int main() {
    while (scanf("%d%d%d", &n, &m, &k) != EOF) work();
    return 0;
}

POJ 3167

题意

基本同上,子串可以重复

思路

基本同上。

匹配成功后的跳转仍然借助失配数组进行跳转。

Code

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#define K 25
#define maxn 100010
using namespace std;
typedef long long LL;
vector<int> ans;
int n, m, k, cnt;
int eq1[maxn][K+10], eq2[maxn][K+10], lt1[maxn][K+10], lt2[maxn][K+10], f[maxn], x[maxn], a[maxn];
bool cmp(int i, int j) { return x[i] < x[j]; }
void init(int* x, int eq[maxn][K+10], int lt[maxn][K+10], int n) {
    for (int i = 1; i <= n; ++i) {
        memcpy(eq[i], eq[i-1], sizeof(eq[0]));
        ++eq[i][x[i]];
    }
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= K; ++j) lt[i][j] = lt[i][j-1] + eq[i][j];
    }
}
bool match1(int i, int j, int x, int y) {
    return eq2[i][x] - eq2[i-j][x] == eq2[j][y] && lt2[i][x-1] - lt2[i-j][x-1] == lt2[j][y-1];
}
bool match2(int i, int j, int x, int y) {
    return eq1[i][x] - eq1[i-j][x] == eq2[j][y] && lt1[i][x-1] - lt1[i-j][x-1] == lt2[j][y-1];
}
void getfail(int* P) {
    int j = 0; f[1] = 0;
    for (int i = 1; i <= m; ) {
        if (!j || match1(i, j, P[i], P[j])) f[++i] = ++j;
        else j = f[j];
    }
}
void kmp(int* T, int* P) {
    int j = 1;
    for (int i = 1; i <= n; ) {
        if (!j || match2(i, j, T[i], P[j])) ++j, ++i;
        else j = f[j];
        if (j == m + 1) {
            ans.push_back(i-m);
            ++cnt;
            j = f[j];
        }
    }
}
void init() {
    memset(x, 0, sizeof(x)); memset(a, 0, sizeof(a)); memset(f, 0, sizeof(f));
    memset(eq1, 0, sizeof eq1); memset(eq2, 0, sizeof eq2);
    memset(lt1, 0, sizeof lt1); memset(lt2, 0, sizeof lt2);
    ans.clear();
}
void work() {
    init();
    for (int i = 1; i <= n; ++i) scanf("%d", &x[i]); init(x, eq1, lt1, n);
    for (int i = 1; i <= m; ++i) scanf("%d", &a[i]); init(a, eq2, lt2, m);
    getfail(a);
    cnt = 0;
    kmp(x, a);
    printf("%d\n", cnt);
    for (vector<int>::iterator it = ans.begin(); it != ans.end(); ++it) printf("%d\n", *it);
}
int main() {
    while (scanf("%d%d%d", &n, &m, &k) != EOF) work();
    return 0;
}
iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决 问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc 阅读详情

相关推荐

GEO芯片数据下载和探针ID转换(保姆级教程)

R语言安装、GEO芯片数据下载、探针ID转换

qq_43138237的博客 3万+

hdu 4749 Parade Show ( kmp )

hdu 4749 Parade Show ( kmp ) 题意:给出两个数列(可以看成串),问最多能在串1中找出几个不重叠的substring,使得这些substring的元素的相对大小关系与串2相同(显然,长度也要与串2相同)。 解题思路:kmp。。比赛的时候有想到这个思路,但一直不知道怎么搞定这个相对大小关系。其实很简单。。 count(AiAn+1)=count(BiBn+1),i

No__stop 2104

图片边界矢量化-地理配准

无地理和投影信息的JPG图片,通过ArcGIS进行地理配准(Georeferencing)完成数字化边界。

u012727861的博客 1905

HDU 4749 KMP... 算是KMP 吧。。。

HDU4749 一道稍微饶了点弯子的KMP 题目。。。 给定一个模式串,要求匹配的字符串中字符的两两大小关系与模式串相同 比如: 模式串 1 3 5 2 4 6 匹配串 9 12 16 10 14 19 就是一组合法的匹配。 其实没什么复杂的。。 顺序处理模式串当中的每一个字符,处理出: (如果该字符之前出现过)在其前面等于该字符的字符位置  (如果该字符没出现过)或者是大

某卖萌喵星人的代码小窝 1303

FPGA—DHT11数字温湿度传感器

1. DH1T11温湿度传感器与DS18B20温湿度传感器非常类似,都是严格按照时序要求写代码。建议可以比较学习。2. 显示温度与湿度部分的数据处理,采用 X10 进行在数码管上的移一位显示,配合了数码管小数部分的显示特点又区分了温度与湿度。3. 程序是按照一个接一个状态及顺序跳转的,建议使用状态机。说明:本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。

m0_72885897的博客 4779

商品评论中的实体情感分析

在之前的文章中我已经将商品评论中的评价实体,也就是特征(feature)给挖掘出来了,我看了一下,挖掘的效果还是不错的。原文链接:http://blog.youkuaiyun.com/chixujohnny/article/details/52794685 下面一步要做的是施加情感因子,也就是说,要将人们评论时候所连带的感情程度施加一下。这项任务的归类应该是情感分析技术。 目前该类问题的情感分析技

chixujohnny 7971

HDU 4749 Parade Show 相对匹配的KMP

题目来源:HDU 4749 Parade Show 题意:从长度为n的序列最多能找到多少个不重叠的的连续的子串 和长度位m的序列的相对大小相同  思路:转化成KMP 把原来的字母相同换成一个检测是否相对大小相同的函数 具体参考了http://blog.youkuaiyun.com/no__stop/article/details/11949743 #include #include const i

嗯。 1611

光谱特征选择之模拟退火算法SA

光谱特征选择之模拟退火算法SA。

weixin_42621095的博客 901

hdu 4749 (转化的KMP)

//hdu 4749 /* 题意:给出两个数列(可以看成串),问最多能在串1中找出几个不重叠的substring,使得这些substring的元素的相对大小关系与串 2相同(显然,长度也要与串2相同)。 解题思路:kmp。。比赛的时候有想到这个思路,但一直不知道怎么搞定这个相对大小关系。其实很简单。。 count(Ai<An+1)=count(Bi<Bn+1),i=1..n count

zxc的专栏 787

【低空经济】无人机充电站设计方案

随着无人机技术的快速发展和广泛应用,其在物流、农业、巡检、救援等领域的应用日益普及。然而,无人机的续航能力一直是限制其大规模应用的关键因素之一。为了解决这一问题,无人机充电站的设计与建设显得尤为重要。本项目旨在设计一套高效、智能、可扩展的无人机充电站系统,以满足不同场景下无人机的充电需求,提升其作业效率和应用范围。无人机充电站的设计将围绕以下几个核心目标展开:首先,充电站应具备快速充电能力,以减少无人机的停机时间,提高作业效率;

2959

ffmpeg在windows的安装、合并、切片、.m4s、.m3u8处理

自己处理视频,我用的工具是 ffmpeg,因为涉及到.m3u8格式和.m4s格式的一些操作。ffmpeg的介绍我就不多说了,这里是它的官网地址: https://ffmpeg.org/ ,这里是文档: https://ffmpeg.org/documentation.html (看的头大,没咋看下去)...

一只爱吃糖的小羊 2689

HDU 4749 Parade Show(KMP)

Parade Show Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 921    Accepted Submission(s): 386 Problem Description   2013 is th

Remilia's 1146

【学前须知】推荐阅读顺序

AUTOSAR学习笔记专栏文章推荐阅读顺序

weixin_47571898的博客 744

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

题目链接 Description 给出\(n\)个序列。找出这\(n\)个序列的最长相同子串。 在这里,相同定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串。 思路 参考:hzwer. 法一:kmp 在第一个串中枚举答案串的开头位置,与其余\(n-1\)个串做\(kmp\). 法二:后缀数组 将\(n\)个串拼接起来。二分答案\(len\),将\(height\)分组...

ahu12345678的博客 144

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

hdu4749 Parade Show(kmp)

题目链接:点这里!!! 题意: 给定两个数组a(文本串),b(模式串)。问文本串能匹配出多少个模式串(不允许重叠)。"匹配"的意思各自离散化之后的串是一样的。 例如:(20,2,2,5,1,3,21)  与 (10 10 15,1) 。(2,2,5,7)与(10,10,15,1)是匹配的。 数据范围len 题解: 1、首先看到这种题目涉及到模式串的匹配问题,很容易往km

Zsss的博客 419

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

hdu 4749 Parade Show(KMP)

题目链接:Parade Show 题目大意:学校要举办一场典礼,要从n个学生中选若干支队伍来,每支队伍有m个人。然后现在将学生的身高划分成k个等级,接着按照学生的顺序给出学生的身高等级,再然后,给出m个人的队伍要求的相对高度。然后要求从n个中间挑选连续的m个人,满足相对高度即可组成一支队伍。问说最多可以组成多少支队伍。 解题思路:KMP算法的变形,只不过在判断相等的时候有点

不慌不忙、不急不躁 1474

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

hdu-4749:Parade Show(kmp模板题)

kmp的略微变形

污miao汪的博客 406

HDU 4749 Parade Show(KMP变形)

题意:有一个文本数列,问可以匹配多少个模式数列(不允许重叠),但这里的“匹配”是这样定义:满足大小关系即可,比如(2,4,4,1)和(33,57,57,2)匹配 思路:明显可以把文本数列和模式数列处理一下,用i与i+1的关系差值代替 再KMP即可,KMP的时候由于不能重叠,所以匹配成功以后,文本串要向后移一位再接着匹配即可 #include #include #include #includ

kalilili的专栏 1069

hdu4749

题意来自 题目大意:学校要举办一场典礼,要从n个学生中选若干支队伍来,每支队伍有m个人。然后现在将学生的身高划分成k个等级,接着按照学生的顺序给出学生的身高等级,再然后,给出m个人的队伍要求的相对高度。然后要求从n个中间挑选连续的m个人,满足相对高度即可组成一支队伍。问说最多可以组成多少支队伍。解题思路:KMP算法的变形,只不过在判断相等的时候有点难办,因为它算的是相对高度,就是同一支队伍中,对应

老李2009 599

hdu 4749

题目很简单,不过题意很难看懂。 就是给一个标准的大小关系的队列,从原队列中找出最多的匹配子队列,感觉就像一个KMP算法+贪心; 不过这个题可能数据有点水把,竟然只要判断相邻的关系就可以A掉; 代码: 1 #include&lt;cstdio&gt; 2 #define maxn 100005 3 using namespace std; 4 int q[maxn],s...

weixin_30622107的博客 158

EOJ——Problem #3167——去掉多余的空白符

去掉多余的空白符 Time limit per test: 1.0 seconds Time limit all tests: 8.0 seconds Memory limit: 256 megabytes 去除一段文字中多余的 whitespace(空格、制表符和换行符),即:当两个单词之间有多个空白符时,只保留第 1 个空白符。 注意:每行首部和 尾部多余的空白符

lose__way的博客 354

字符串 KMP HDU 4749

#include #include /* 10 5 10 2 4 2 4 2 4 2 4 2 4 1 2 1 2 1 题目大意:给一个N,M,K,序列a[],b[],在a[]中找出,和b[]相对大小一样的子序列 求序列的个数(序列不能重复) 思路:KMP,找到满足条件,跳到i+m处 继续往下搜 主要难点在于,如何判断满足条件。 我们只要比较i之前a中a[i]的个数和B中B[i]的个数是

DouBoomFly的博客 409

3167:神奇的辣条

3167: 神奇的辣条 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 710  Solved: 257 [Submit][Status][Web Board] Description 豆豆与牛牛计控学院在学神,每次考试他俩都是前两名。然而两人都想正当第一名。聪明的豆豆发现了成为第一名,是和两人考试前几天吃辣条的数量有关。

越努力,越幸运!!! 882

kmp变形 如何判断第i个字符是否匹配函数 hdu 4749

题目来源: http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意: 题意:给出两个数字串A、B。问A中有多少不相交的子串a能匹配B。匹配的意思是a中任意两个位置i和j的大小关系和B的这两个位置的大小关系是一样的。 思路:若是完全一模一样的匹配的话那么KMP是很好理解的。那么对于上述的比较方式怎么比较两个串相等呢?对于a的位置j和B的位置i(j...

weixin_34023863的博客 133

Hdu-4749 Parade Show

Description   2013 is the 60 anniversary of Nanjing University of Science and Technology, and today happens to be the anniversary date. On this happy festival, school authority hopes that the

WZJRJ28 518

2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何

题目链接 题意: 圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO, 要在圆上找一点 D,使得 PD + QD 取到最小值。 官方题解: 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r。 Q点同理。 极小化PD+QD可以转化为极小化P'D+Q'D。 当P'Q'与圆有交点时,答案为两点距离

kkkkahlua的博客 1668
上一篇: 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E Maximum Flow
下一篇: HDU 3336 Count the string 所有前缀在串中的出现总次数
kkkkahlua
博客等级 码龄12年 4粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值