UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>

K - 秋实大哥の恋爱物语

Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others)

Submit Status

传说有这么一个故事!

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

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

将两个相邻的音符连起来,则妹子吹出的音符可以画出一条折线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 and output

Sample Input Sample Output
14
1 1 5 5 6 6 5 4 4 3 3 2 2 1
14
0 0 4 4 5 5 4 3 3 2 2 1 1 0
Wow! Life Winner!
1
20
1 2 1 2 1 2 1 2 1 1 0 1 3 2 3 2 7 6 7 2
3
6 5 6
Wow! Life Winner!
6
25
2 3 2 3 3 2 3 3 3 2 3 2 2 3 3 2 2 2 3 3 3 3 2 3 3
3
2 3 3
Wow! Life Winner!
5
29
6 6 7 5 5 6 4 4 5 3 3 4 2 2 3 1 1 2 0 0 1 -1 -1 0 -2 -2 -1 -3 -3
8
6 6 7 5 5 6 4 4
Wow! Life Winner!
8
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
Oh. That‘s impossible. I must have had a dream.

解题报告:

本题的正解是作差分再跑kmp..因为自己当时比较没想多。。构造的是最长前缀后缀等差数列....所以在失陪的时候还需要更改dis...

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 2e6+50;
int front[maxn],s1[maxn],s2[maxn],len1,len2;

void build_front()
{
   front[0] = -1;
   int t1 = -1 ,t2 = 0,dis;
   while(t2 < len2)
    {
        if (t1 == -1 || s2[t2] - s2[t1] == dis)
         {
             if (t1 == -1)
              {
                  dis = s2[t2] - s2[++t1];
                  if (t2 == 0)
                   t1--;
             }
             front[++t2] = ++t1;
         }
        else
         t1 = front[t1];
    }
}

int kmp_search()
{
   int t1 = 0 , t2 = 0 , ans = 0 , dis = s1[0] - s2[0];
   while(t1 < len1)
    {
        if (t2 == -1 || s1[t1] - s2[t2] == dis )
         {
             if (t2 == -1)
               dis = s1[t1] - s2[++t2];
            t1++,t2++;
         }
        else
         {
             t2 = front[t2];
             dis = s1[t1-1] - s2[t2-1];
         }
        if (t2 == len2)
         {
             ans ++;
             t2 = front[t2];
             dis = s1[t1-1] - s2[t2-1];
         }
    }
   return ans;
}

int main(int argc,char *argv[])
{
  scanf("%d",&len1);
  for(int i = 0 ; i < len1 ; ++ i)
   scanf("%d",&s1[i]);
  scanf("%d",&len2);
  for(int i = 0 ; i < len2 ; ++ i)
   scanf("%d",&s2[i]);
  build_front();
  int ans = kmp_search();
  if (ans)
   printf("Wow! Life Winner!\n%d\n",ans);
  else
   printf("Oh. That‘s impossible. I must have had a dream.\n");
  return 0;
}
时间: 2024-07-31 14:33:01

UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>的相关文章

UESTC_秋实大哥与妹纸 2015 UESTC Training for Data Structures&lt;Problem F&gt;

F - 秋实大哥与妹纸 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 1500/1500KB (Java/Others) Submit Status 致中和,天地位焉,万物育焉.秋实大哥是一个追求中庸的人. 虽然秋实大哥的仰慕者众多,但秋实大哥不喜欢极端的妹纸.所以他想从所有仰慕自己的妹纸中挑选出一个符合中庸之道的. 每一个妹纸对秋实大哥的仰慕程度可以用一个整数ai来表示,秋实大哥想要找出这些数的中位数. 计算有限个数的数据的中位

UESTC_全都是秋实大哥 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem J&gt;

J - 全都是秋实大哥 Time Limit: 5000/2000MS (Java/Others)     Memory Limit: 32000/32000KB (Java/Others) Submit Status 秋实大哥是一个多愁善感的人,偶尔也会唱唱两句伤情的歌.每次唱完后,秋实大哥都能解决一道问题!这次也不例外. 秋实大哥告诉了你 一些关于这个问题的信息 如果一个字符串S是由若干个子串a连续拼接而成的,则称a是S的循环节,即A=a+a+...+a.比如 aba 是 abaabaaba

UESTC_秋实大哥与线段树 2015 UESTC Training for Data Structures&lt;Problem M&gt;

M - 秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status “学习本无底,前进莫徬徨.” 秋实大哥对一旁玩手机的学弟说道. 秋实大哥是一个爱学习的人,今天他刚刚学习了线段树这个数据结构. 为了检验自己的掌握程度,秋实大哥给自己出了一个题,同时邀请大家一起来作. 秋实大哥的题目要求你维护一个序列,支持两种操作:一种是修改某一个元素的值:一

UESTC_秋实大哥与连锁快餐店 2015 UESTC Training for Graph Theory&lt;Problem A&gt;

A - 秋实大哥与连锁快餐店 Time Limit: 9000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 成大事者,不惟有超世之才,亦有坚忍不拔之志. 秋实大哥开了一家快餐店之后,由于人赢光环的影响,很快就赚得了大量的资金.为了继续实现心中的远大的理想,他打算在全国各地开设分店赚大钱.假设现在有n家快餐店(其中有至少有一家是旗舰店)分布在二维平面上,第i家快餐店的坐标为(xi,

UESTC_秋实大哥与时空漫游 2015 UESTC Training for Graph Theory&lt;Problem C&gt;

C - 秋实大哥与时空漫游 Time Limit: 4500/1500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 秋实大哥通过全国的连锁快餐店发家致富,赚了大钱,接下来他打算通过这些钱实现他的另一个梦想————遨游太空,漫游星际. 秋实大哥满怀期待的出发了. .......啦啦啦啦啦啦啦啦啦...... 最后,秋实大哥花完了钱,觉得是时候回地球继续赚钱和过节了. 但是却被告知回地球的专机

UESTC_Palindromic String 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem M&gt;

M - Palindromic String Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 128000/128000KB (Java/Others) Submit Status 秋实大哥喜欢探索新鲜事物,最近他发明了一种新型回文串,叫K重回文串!今天他想用它来考考小朋友们. 秋实大哥给出了与K重回文串有关的信息 任何字符串都属于0重回文串,包括空字符串. 一个长度为N的字符串S,S是K(k≥1)重回文串,当且仅当S是回文串,且其

UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem N&gt;

N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Status 一天,韩爷去百度面试,面试官给了他这么一个问题. 给你2万个字符串,每个字符串长度都是100,然后把2万个字符串丢入一个 set< string >g 中,问最终set里含有多少个元素? g 是一个用来存储字符串.具有去重功能的容器,即相同字符串在 g 中只能保留一个. 两个字符串相等,当且

UESTC_吴队长征婚 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem E&gt;

E - 吴队长征婚 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 吴队长征婚这件事因为请客而没有传出去(虽然他忘了请一个队吃饭),于是吴队长高兴地玩起了木棒.吴队长拿了一些长度相同的木(guang)棒(gun),随机的把它们截成了N段,每一段最长50.现在他想把这些木棒还原成原来的状态,但是他忘记了原来的木棒有多少根,也忘记了每一根有多长.请帮助

UESTC_基爷的中位数 2015 UESTC Training for Search Algorithm &amp; String&lt;Problem D&gt;

D - 基爷的中位数 Time Limit: 5000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给你N个数,X1,X2,...,XN, 基爷让我们计算任意两个数差的绝对值 ∣Xi−Xj∣ (1≤i<j≤N) . 这样,我们可以得到 C2N 个数. 现在,基爷希望聪明的你能用一个简单的程序求出这 C2N 个数的中位数! Input 输入有多组数据. 每组数据,第一行一个整数 N