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


    K - 秋实大哥の恋爱物语

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

    传说有这么一个故事!

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

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

    title

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

    Input

    第一行输入一个整数N(2N2106),表示妹子吹了N个音符。

    第二行输入N个音符,每个音符都是整数,且在32位整数范围内,每两个音符用一个空格隔开。

    第三行输入一个整数M(2M2106),表示秋实大哥吹了M个音符。

    最后一行输入M个音符,每个音符都是整数,且在32位整数范围内,每两个音符用一个空格隔开。

    Output

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

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

    Sample input and output

    Sample InputSample 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!
    %d
    ",ans);
      else
       printf("Oh. That's impossible. I must have had a dream.
    ");
      return 0;
    }
    No Pain , No Gain.
  • 相关阅读:
    Struts2的OGNL的用法
    详解DataTable DataSet以及与数据库的关系
    ModBus 协议
    STM32串口接收中断溢出问题解决
    STM32 GD32 时钟设置
    STM32 中断
    STM32 中断系统
    STM32中断系统(NVIC和EXTI)
    STM32中断系统
    GD32E230 GPIO 时钟
  • 原文地址:https://www.cnblogs.com/Xiper/p/4499178.html
Copyright © 2020-2023  润新知