博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDU1711】Number Sequence
阅读量:5281 次
发布时间:2019-06-14

本文共 1081 字,大约阅读时间需要 3 分钟。

题面

大致题意:

给定两个数列A,B,长度分别为N和M

求出 满足 Ak=B1 ,Ak+1=B2......Ak+M-1=Bm
的最小k值
如果有多个k值输出最小的一个

题解

KMP裸题

直接计算B数列的next值KMP匹配即可

#include
#include
#include
#include
#include
#include
using namespace std;#define MAX 1000100int nt[MAX],A[MAX],B[MAX],N,M;inline int read(){ register int x=0,t=1; register char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-'){t=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*t;}void GetNext(){ nt[1]=0; for(int i=2;i<=M;++i) { int t=nt[i-1]; while(B[t+1]!=B[i]&&t) t=nt[t-1]; if(t==0) { if(B[1]==B[i]) nt[i]=1; else nt[i]=0; } else nt[i]=t+1; }}int KMP(){ int i=1,j=1; while(j<=N) { if(B[i]==A[j]) { ++i;++j; } else { if(i==1)j++; else i=nt[i-1]+1; } if(i>M) return j-M; } return -1;}int main(){ int T=read(); while(T--) { N=read();M=read(); for(int i=1;i<=N;++i) A[i]=read(); for(int j=1;j<=M;++j) B[j]=read(); GetNext(); printf("%d\n",KMP()); } return 0;}

转载于:https://www.cnblogs.com/cjyyb/p/7223236.html

你可能感兴趣的文章
oracle sequence用法
查看>>
JAVA中CommonUtils的uuid()方法和toBean()方法
查看>>
BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )
查看>>
【网络爬虫】【java】微博爬虫(三):庖丁解牛——HTML结构分析与正则切分...
查看>>
数据挖掘-逻辑回归解析
查看>>
RedHat vm使用host-only方式连接主机 (备忘)
查看>>
SoupUI 结合loadrunner压力测试
查看>>
Delicious Apples(多校联合训练) 分类: ACM ...
查看>>
aop学习总结二------使用cglib动态代理简单实现aop功能
查看>>
4.自定义序列类
查看>>
使用Joson的格式字符串在Socket中通讯时数据格式的转换
查看>>
cplusplus系列>algorithm>std::for_each
查看>>
SQL2008 使用新创建的身份验证连接到数据库后无法访问具体数据库
查看>>
【SpringBoot学习笔记】Maven子工程图标不识别——子工程配置文件图标不识别
查看>>
UVA 437 巴比伦塔 【DAG上DP/LIS变形】
查看>>
针对MySql封装的JDBC通用框架类(包含增删改查、JavaBean反射原理)
查看>>
sprintf 心得
查看>>
The Solution of UESTC 2016 Summer Training #1 Div.2 Problem C
查看>>
C#中的序列化与反序列化
查看>>
WPF的项目,ListBox 纵向滚动条不显示
查看>>