F

原创 2015年11月20日 17:27:00

F

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给出两串数字A[ ],B[ ],如果B是A的子串,那么输出B在A中第一次出现的位置,否则输出-1。
 

输入

 第一行,输入一个T,表明后面有几组数据。每组数据的第一行,输入两个数N、M (1 <= N <= 1000000, 1 <= M <= 10000),N表示第一行数字的个数,M表示第二行数字的个数。接下来两行,分别输入A数列和B数列。

输出

 输出只有一行。如果数列B在数列A中出现过,输出数列B在数列A中第一次出现的位置,如果没有出现过,输出-1。

示例输入

2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1

示例输出

6 10
-1

提示

 

来源

 zmx

示例程序

 
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
int  a[1000001],b[1000001];  
int next[1000000];  
void Next(int str[],int len)  
{  
    next[0] = -1;  
    for(int j = 1 ; j < len ; j++)  
    {  
        int i = next[j-1];  
        while(str[j] != str[i+1] && i >= 0)  
        {  
            i = next[i];  
        }  
        if(str[j] == str[i+1])  
        {  
            next[j] = i+1;  
        }  
        else  
        {  
            next[j] = -1;  
        }  
    }  
}  
int kmp(int des[],int len1,int pat[],int len2)  
{  
    Next(pat,len2);  
    int p=0,s=0;  
    while(p < len2  && s < len1)  
    {  
        if(pat[p] == des[s])  
        {  
            p++;s++;  
        }  
        else  
        {  
            if(p==0)  
            {  
                s++;  
            }  
            else  
            {  
                p = next[p-1]+1;  
            }  
        }  
    }  
    if(p < len2)  
    {  
        return -1;  
    }  
    return s-len2+1;  
}  
int main()  
{  
int i,j,n,m,k,t,l1,l2;  
scanf("%d",&n);  
while(n--)  
{  
scanf("%d %d",&m,&t);  
{  
for(i=0;i<m;i++)  
scanf("%d",&a[i]);  
for(i=0;i<t;i++)  
scanf("%d",&b[i]);  
k=kmp(a,m,b,t);  
if(k!=-1)  
printf("%d %d\n",k,k+t-1);  
else  
printf("%d\n",k);  
}  
}  
}  

相关文章推荐

STM32F10x硬件I2c读写AT24c02,程序卡死

硬件I2C。一直是卡死在while等待; while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); wh...

第51章 设置FLASH的读写保护及解除—零死角玩转STM32-F429系列

第51章     设置FLASH的读写保护及解除 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku...

STM32F0xx_DMA收发USART数据配置详细过程

前言 关于DMA(Direct Memory Access)的功能,前面关注我微信的人应该知道,其实我已经在F1芯片上简单讲了一下。有网友要求在F0讲解一下使用DMA收发串口数据。今天就应网友要求总...

STC15F2K60S2串口通信程序

STC15F2K60S2串口通信程序

IIS,Apache,Nginx环境支持flv,f4v,mp4视频的播放

IIS,Apache,Nginx环境都可以很好的支持视频的播放。但具体的配置以及对视频支持的程度不同。 比如IIS要支持flv视频的拖动,目前基本没有找到好的办法。 目前各大视频网站主要使用的环境...

信息检索(IR)的评价指标介绍-准确率、召回率、F1、mAP、ROC、AUC

申明:本文非笔者原创,原文转载自:https://yongyuan-workbench.rhcloud.com/%E4%BF%A1%E6%81%AF%E6%A3%80%E7%B4%A2ir%E7%9A...

第41章 RS-485通讯实验—零死角玩转STM32-F429系列

第41章     RS-485通讯实验 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/...

STM32F051用jlink V8进行调试设置MDK环境buc

最近自己做了一块STM32F051R8的板子,cortex M0,本来想着就串口用flash loader demo 下载程序吧。后来发现调试程序还是有点麻烦,就买了个山寨的jlink V8。我是用k...

STM32F4 系统时钟

在开始之前先解释几个名词: HSI: High Speed Internal clock, 高速内部时钟, STM32F429xx默认为16MHz. HSE: High Speed Externa...

STM32F407的ADC单次转换

用到的引脚是PA3也就是ADC1的通道3 1、ADC的主要参数 a、分辨率----stm32f407的分辨率有6位、8位、10位、12位,参考电压如果是3.3 那么最小分辨率就是3.3/4095。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:F
举报原因:
原因补充:

(最多只允许输入30个字)