国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

KMP的應用

2019-11-08 20:04:52
字體:
來源:轉載
供稿:網友

數據結構實驗之串三: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

51 2 3 4 532 3 4

Example Output

2 4

Hint

Author

windream思路解析:典型的KMP問題,只要將模板寫下,然后根據題意,寫出細節就好了。#include<stdio.h>int a[100000009],b[100000009];int next[100000010],n,m;void Next(){    next[0]=-1;    for(int j=1;j<m;j++)    {        int i=next[j-1];        while(b[j]!=b[i+1]&&i>=0)        {            i=next[i];        }        if(b[j]==b[i+1])            next[j]=i+1;        else            next[j]=-1;    }}int KMP(int a[],int b[]){    Next();   int p=0,s=0;   while(p<m&&s<n)   {       if(a[s]==b[p])       {           s++;           p++;       }       else       {           if(p==0)            s++;           else            p=next[p-1]+1;       }   }   if(p<m)    return -1;   else    return s-m+1;}int main(){    int i, k, t;    while(scanf("%d",&n)!=EOF)    {        for(i=0;i<n;i++)        scanf("%d",&a[i]);        scanf("%d",&m);    for(i=0;i<m;i++)        scanf("%d",&b[i]);    k = KMP(a,b);    if(k!=-1)    {        t = KMP(a+k,b);        if(t==-1)            printf("%d %d/n", k, k+m-1);        else            printf("-1/n");    }    else        printf("-1/n");}  return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 博野县| 将乐县| 松原市| 泰来县| 荆州市| 壤塘县| 长汀县| 娄烦县| 洛扎县| 阿尔山市| 托里县| 铜鼓县| 寻乌县| 庆云县| 永州市| 勐海县| 黎城县| 伊宁市| 曲松县| 五莲县| 南汇区| 城固县| 青州市| 霸州市| 商南县| 汝城县| 自贡市| 晋中市| 惠水县| 民勤县| 昭觉县| 敦化市| 永平县| 普宁市| 微山县| 堆龙德庆县| 安泽县| 新安县| 恩平市| 湘潭市| 广东省|