HDU 1711 Number Sequence

大意是给两个序列,求第二个序列在第一个序列中的最小位置,无解输出-1。

朴素算法O(m*n),m<=10000,n<=1000000.肯定超时

所以就要用到KMP算法,俗称看毛片算法(我是不喜欢这么叫的。。)

KMP算法是预处理出目标串的失配边,然后遇到不匹配的就顺着失配边走,直到找到匹配。

看起来很难理解,那末举个例子:

1<=i<=11

b[i]=(1 2 3 1 2 5 6 1 2 3 4)

那末它的失配数组是 

1<=i<=12

f[i]=(1 1 1 1 2 3 1 1 2 3 4 1)

意思是,当i这个位置不匹配时,就转到f[i]继续进行比较。

为什么多一个呢?因为匹配完之后要回到开头。

构造和比较很像,也是顺着失配边走

代码:

<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[1000020],b[1000020],a[1000010];
int j,n,m,t;
void kmp(int m)
{
	f[1]=1;f[2]=1;
	int j=0;
	int i=0;
	for(i=2;i<=m;++i)
	{
		j=f[i];
		while(j>1&&b[i]!=b[j])j=f[j];//跟着失配边走,直到回到开头或找到匹配
		if(b[i]==b[j])f[i+1]=j+1;
		else f[i+1]=1;//如果相等就从下一个开始比较
	}//构造失配边
	j=1;
	for(i=1;i<=n;++i)
	{
		while(j>1&&b[j]!=a[i])j=f[j];//跟着失配边走,直到回到开头或找到匹配
		if(b[j]==a[i])++j;//如果相等就从下一个开始比较
		if(j==m+1)
		{
			printf("%d\n",i-m+1);
			return;
		}
	}
	printf("%d\n",-1);
	return;
}
int main()
{
	//freopen("1711.in","r",stdin);
	scanf("%d",&t);
	for(int i=1;i<=t;++i)
	{
		memset(f,0,sizeof(f));
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		scanf("%d%d",&n,&m);
		for(int j=1;j<=n;++j)
		scanf("%d",&a[j]);
		for(int j=1;j<=m;++j)
		scanf("%d",&b[j]);
		//if (kmp(m)==-1) printf("%d",-1);
		kmp(m);
	}
	return 0;	
}</span>
物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁与低能耗的优势,获得了广泛应用。为确保MQTT客户端与服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑与数据结构,同时保持了代码的清晰度与可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其与Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些不同版本的验证,以确保基于各版本开发的设备与应用均能满足一致的质量与可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性与系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### 题目与解答资源整理 对于杭州电子科技大学在线评测系统(HDU OJ)的题目和对应的 C++ 解答,可以通过以下几种方式获取相关资源: 1. **站内资源与题解整理**: - HDU OJ 最基础的 50 题涵盖了一些常见的编程问题,例如汉字统计、进制转换、杨辉三角等。这些问题的解答通常涉及基础的算法和数据结构,可以作为初学者的入门练习。 - 针对每道题,可以通过在线社区或博客找到相关的 C++ 解答。例如,2007 题(平方和与立方和)的解法中,使用了 `pow` 函数进行平方和立方的计算,并通过循环遍历区间内的所有数,根据奇偶性分别累加结果[^2]。 2. **OJ 平台提交记录**: - 在杭电 OJ 平台上刷题时,可以通过提交记录查看自己的代码并通过调试不断完善。例如,在 2007 题中,提交的代码需要处理输入顺序可能颠倒的情况,并对范围内的数进行分类计算[^2]。 - 对于其他题目,如 2030 汉字统计,通常涉及字符编码的处理,例如判断一个字符是否为汉字(通常为多字节字符),并统计汉字数量。 3. **题库分类与推荐**: - 杭电 OJ 的题库可以按照难度和类型进行分类,例如数学题、字符串处理、动态规划、图论等。推荐的题目包括 1005、1012、1019 等,这些题目涵盖了基础的算法和数学知识[^3]。 - 初学者可以从较简单的题目入手,例如 1005(Number Sequence)涉及递归和模运算,1019(Least Common Multiple)涉及最大公约数和最小公倍数的计算。 4. **C++ 解答示例**: - 对于 2007 题(平方和与立方和),以下是一个 C++ 的示例解答: ```cpp #include <iostream> #include <cmath> using namespace std; int main() { int a, b, temp; int sum1 = 0, sum2 = 0; while (cin >> a >> b) { if (a > b) { temp = a; a = b; b = temp; } sum1 = 0; sum2 = 0; for (int i = a; i <= b; i++) { if (i % 2 == 0) { sum2 += pow(i, 2); } else { sum1 += pow(i, 3); } } cout << sum2 << " " << sum1 << endl; } return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值