• cdoj1091-秋实大哥の恋爱物语 【kmp】


    http://acm.uestc.edu.cn/#/problem/show/1091

    秋实大哥の恋爱物语

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

    传说有这么一个故事!

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

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

    title

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

    Input

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

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

    第三行输入一个整数M(2M2 000 000),表示秋实大哥吹了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。题目说判断折线重合,可以把原数据的相邻的点做减法,就可以直接用kmp求子串出现次数了。至于kmp,可以参考我这篇博文:http://www.cnblogs.com/jiu0821/p/4189987.html。单求子串第一次出现的位置,不需要用到next数组的next[len];求子串出现次数的话,需要用到next[len],意思是每次匹配完毕,j就等于len,这时候理解为第len项不匹配(事实上t串没有这一项),令j=next[len],求解下一次出现情况,最后达到目的。

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 using namespace std;
     6 
     7 const int N=2000005;
     8 int s[N],t[N];
     9 int next_[N],len,ls;
    10 
    11 void get_next_();
    12 int kmp();
    13 
    14 int main(){
    15     //freopen("D:\input.in","r",stdin);
    16     scanf("%d%d",&ls,&s[0]);
    17     for(int i=1;i<ls;i++)   scanf("%d",&s[i]),s[i-1]=s[i]-s[i-1];
    18     scanf("%d%d",&len,&t[0]);
    19     for(int i=1;i<len;i++)   scanf("%d",&t[i]),t[i-1]=t[i]-t[i-1];
    20     ls--,len--;
    21     get_next_();
    22     int ans=kmp();
    23     if(ans) printf("Wow! Life Winner!
    %d
    ",ans);
    24     else    puts("Oh. That's impossible. I must have had a dream.");
    25     return 0;
    26 }
    27 void get_next_(){
    28     next_[0]=-1;
    29     next_[1]=0;
    30     for(int i=1;i<len;i++){
    31         int j=next_[i];
    32         while(1){
    33             if(t[i]==t[j]){
    34                 next_[i+1]=j+1;
    35                 break;
    36             }else{
    37                 j=next_[j];
    38             }
    39             if(j<0){
    40                 next_[i+1]=0;
    41                 break;
    42             }
    43         }
    44     }
    45 }
    46 int kmp(){
    47     int ans=0,i=0,j=0;
    48     while(i<ls){
    49         if(j<0||s[i]==t[j])  ++i,++j;
    50         else    j=next_[j];
    51         if(j==len){
    52             ans++;
    53             j=next_[j];
    54         }
    55     }
    56     return ans;
    57 }
  • 相关阅读:
    Spring MVC国际化
    cvc-complex-type.2.3: Element 'beans' cannot have character [children]
    jstl fmt
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
    eclipse 使用tomcat7.0建立Dynamic Web Project 时 web.xml的问题
    JAVA学习(七)__Spring的@Autowired注入规则
    Java中的默认构造函数
    Spring的国际化(转载)
    java工程中不能存在多个数据库连接jar包
    HDU 3265 Posters
  • 原文地址:https://www.cnblogs.com/jiu0821/p/4526604.html
Copyright © 2020-2023  润新知