博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
阅读量:6648 次
发布时间:2019-06-25

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

 秋实大哥の恋爱物语

Time Limit: 20 Sec  Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/contest/show/61

Description

传说有这么一个故事!

在一个月白风清的晚上,秋实大哥约一位他心仪的妹子一起逛校园,浪漫的秋实大哥决定在当晚对妹子表白。“XXXXX...”,秋实大哥温情地说完了 准备已久的话。而妹子决定用一种浪漫的方式接受秋实大哥(其实妹子早已对秋实大哥动心,这一刻她早已迫不及待了,但还是决定考秋实大哥最后一关,再委婉地 接受)。妹子拿出了她心爱的口琴,吹出了一首迷人的曲子...... “你能把我的曲子重复一遍么?”,但考虑到万一秋实大哥没有做到而失去了赢得人赢的心的机会,妹子又说到,“只要你能吹出我的一部分旋律,我就答应你,从 今以后,我就是你的一部分”。

好奇心重的你,真的很想知道秋实大哥最终有没有抱得美人归,除此之外,你还想知道秋实大哥吹出的曲子的旋律有多少次符合妹子的旋律。

title

将两个相邻的音符连起来,则妹子吹出的音符可以画出一条折线A,同样,秋实大哥吹出的音符也可以画出一条折线B,如果折线B已经与折线A的某一段完全重合,或者能够经过上下左右平移与折线A的某一段完全重合,则表示秋实大哥吹出了妹子的一部分旋律。

Input

第一行输入一个整数N(2≤N≤2⋅106),表示妹子吹了N个音符。
第二行输入N个音符,每个音符都是整数,且在32位整数范围内,每两个音符用一个空格隔开。
第三行输入一个整数M(2≤M≤2⋅106),表示秋实大哥吹了M个音符。
最后一行输入M个音符,每个音符都是整数,且在32位整数范围内,每两个音符用一个空格隔开。

Output

如果秋实大哥抱得美人归了,第一行输出Wow! Life Winner!,第二行再输出一个整数,表示秋实大哥的曲子的旋律有多少次符合妹子的。

如果秋实大哥没有做到,输出Oh. That's impossible. I must have had a dream.

 

Sample Input

26
1 1 0 1 0 1 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 1 1 0 1 0
5
1 1 0 1 1

Sample Output

Oh. That's impossible. I must have had a dream.

HINT

 

题意

 

题解:

kmp基础题

代码:

 

//qscqesze#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;using namespace std;//freopen("D.in","r",stdin);//freopen("D.out","w",stdout);#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)#define maxn 2000010#define mod 10007#define eps 1e-9int Num;char CH[20];//const int inf=0x7fffffff; //нчоч╢Сconst int inf=0x3f3f3f3f;/*inline void P(int x){ Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts("");}*///**************************************************************************************inline ll read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}inline void P(int x){ Num=0;if(!x){putchar('0');puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts("");}int a[maxn];int b[maxn];int c[maxn];int d[maxn];int p[maxn];int main(){ int n=read(); for(int i=1;i<=n;i++) a[i]=read(); int m=read(); for(int i=1;i<=m;i++) b[i]=read(); n--; for(int i=1;i<=n;i++) c[i]=a[i+1]-a[i]; m--; for(int i=1;i<=m;i++) d[i]=b[i+1]-b[i]; int j=0; for(int i=2;i<=m;i++) { while(j>0&&d[j+1]!=d[i])j=p[j]; if(d[j+1]==d[i])j++; p[i]=j; } j=0; int ans=0; for(int i=1;i<=n;i++) { while(j>0&&d[j+1]!=c[i])j=p[j]; if(d[j+1]==c[i])j++; if(j==m){ans++;j=p[j];} } if(ans) printf("Wow! Life Winner!\n%d\n",ans); else printf("Oh. That's impossible. I must have had a dream.\n");}

 

转载地址:http://hsuto.baihongyu.com/

你可能感兴趣的文章
直播疑难杂症排查(3)— 首开慢
查看>>
某公司机房成功搭建openssh server跳板服务器
查看>>
ADT在線互動教學
查看>>
PowerShell 添加 自定义的ScriptProperty 属性
查看>>
Shell一些例子
查看>>
MySQL 可优化的一些参数详解
查看>>
zabbix监控web页面,以及告警配置
查看>>
C#中传值调用和传引用调用的理解
查看>>
硬盘整数分区最精确地方法(转载)
查看>>
Oracle-压缩数据
查看>>
Exchange Server2010系列之十六:客户端访问方式
查看>>
crawler4j 爬爬知多少
查看>>
记录:Protocol Buffers(protobuf)在Java开发中使用
查看>>
关于Diablo3的历史和现状思考
查看>>
一个tomcat配置多个端口
查看>>
ORACLE审计小结
查看>>
【翻译】Ext JS 4.1最终版发布
查看>>
加速OpenStack云落地——UnitedStack发布UOS 2.0
查看>>
C++中const用法总结
查看>>
alibaba druid 在springboot start autoconfig 下的bug
查看>>