zoukankan      html  css  js  c++  java
  • SDUT 3311 数据结构实验之串三:KMP应用

    数据结构实验之串三:KMP应用

    Time Limit: 1000MS Memory Limit: 65536KB

    Problem Description

    有n个小朋友,每个小朋友手里有一些糖块,现在这些小朋友排成一排,编号是由1到n。现在给出m个数,能不能唯一的确定一对值l和r(l <= r),使得这m个数刚好是第l个小朋友到第r个小朋友手里的糖块数?

    Input

    首先输入一个整数n,代表有n个小朋友。下一行输入n个数,分别代表每个小朋友手里糖的数量。

    之后再输入一个整数m,代表下面有m个数。下一行输入这m个数。

    Output

     如果能唯一的确定一对l,r的值,那么输出这两个值,否则输出-1

    Example Input

    5
    1 2 3 4 5
    3
    2 3 4

    Example Output

    2 4

    DQE:

     
    KMP算法的简单应用,注意本题要求有唯一解,熟悉判断唯一解的方法即可,水题++;
     
     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 void cnext(int *y,int *next)
     5 {
     6     int i=1,j=0;
     7     next[i]=j;
     8     while(i<y[0])
     9     {
    10         if(j==0||y[i]==y[j])
    11         {
    12             i++;
    13             j++;
    14             next[i]=j;
    15         }
    16         else
    17         {
    18             j=next[j];
    19         }
    20     }
    21 }
    22 
    23 int kmp(int *x,int *y,int *next,int pos)
    24 {
    25     int i=pos,j=1;
    26     while(i<=x[0]&&j<=y[0])
    27     {
    28         if(j==0||x[i]==y[j])
    29         {
    30             i++;
    31             j++;
    32         }
    33         else
    34         {
    35             j=next[j];
    36         }
    37     }
    38     if(j>y[0])
    39         return i-y[0];
    40     return -1;
    41 }
    42 
    43 int main()
    44 {
    45     static int x[1000001],y[1000001];
    46     static int next[1000001];
    47     int i,j;
    48     while(scanf("%d",x)!=EOF)
    49     {
    50         for(i=1;i<=x[0];i++)
    51         {
    52             scanf("%d",&x[i]);
    53         }
    54         scanf("%d",y);
    55         for(i=1;i<=y[0];i++)
    56         {
    57             scanf("%d",&y[i]);
    58         }
    59         cnext(y,next);
    60         i=kmp(x,y,next,1);
    61         if(i!=-1)
    62         {
    63             j=kmp(x,y,next,1+i);
    64             if(j==-1)
    65             {
    66                 printf("%d %d
    ",i,i+y[0]-1);
    67             }
    68             else
    69             {
    70                 printf("-1
    ");
    71             }
    72         }
    73         else
    74         {
    75             printf("-1
    ");
    76         }
    77     }
    78     return 0;
    79 }
    80 
    81 /***************************************************
    82 User name: ***
    83 Result: Accepted
    84 Take time: 172ms
    85 Take Memory: 1304KB
    86 Submit time: 2016-11-02 21:35:25
    87 ****************************************************/
  • 相关阅读:
    [CodeForces
    [CodeChef]RIN(最小割)
    [Bzoj3894]文理分科(最小割)
    [Poj3469]Dual Core CPU(最小割)
    MySQL- 锁(3)
    MySQL- 锁(1)
    MySQL- 锁(2)
    MySQL-中文全文检索
    Solr
    多线程编程-之并发编程:同步容器
  • 原文地址:https://www.cnblogs.com/Leroscox/p/6031958.html
Copyright © 2011-2022 走看看