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);  
}  
}  
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

[Codeforces 808F] [二分] [最小割] Card Game

题意大概就是选一些物品,这个物品魔力值的两两之和为合数,物品等级要小于你的等级,求你最小的等级,可以选出这样的一些物品使这些物品能力值之和>=k。首先可以二分答案,然后就变成最小割的经典模型魔力值为奇...

蓝牙连接MSP430F1232单片机之后,不传输数据

通过安卓手机端的软件来接受蓝牙数据,蓝牙连接单片机,通过单片机的串口将数据给蓝牙,然后蓝牙再发送给手机,现在手机端通过Eclipse调试,发现应该是卡在了输入流的read上,因为read方法是阻塞式的...

STM32F4教程从零开始2——更合理的工程与GPIO操作

都带点

STM32f103之USART+EXTI+TIMER+KEY+LED(简单综合应用)1

申明:本程序都是在原有

基于stm32f103zet6的IIC学习

一、先简单了解下所为的IIC协议: IIC(Inter -Integrated Circuit) 总线是一种由PHILIPS 公司开发的两线式串行总线,用于连接 微控制器及其外围设备。它是由数据线...

F - Drying

It is very hard to wash and especially to dry clothes in winter. But Jane is a very smart girl. She ...

简单实现stm32f103芯片usb模拟U盘进行IAP更新用户程序

更新单片机内的用户程序,方式一般都是仿真器,串口,网络口,usb DFU,另类一点CAN也行,但是这些方式都有一个共同点,必须要有相应的上位机配合操作,还要教会别人使用,那么能不能有更简单傻瓜化的升级...
  • lrmlrm
  • lrmlrm
  • 2016-05-26 14:58
  • 10151

实时错误'-2147217873(80040e2f)

机房收费系统:实时错误'-2147217873(80040e2f)不能将 NULL 值插入列;列不允许空值,INSERT 失败。

shell编程——if语句 if -z -n -f -eq -ne -lt

if  条件 then  Command else  Command fi              ...
  • yi412
  • yi412
  • 2014-08-18 08:32
  • 558

s3c2440 nand 控制器(以对K9F2G08U0A 256M读操作为例)

2010-01-08 22:10:48|  分类: arm|字号 订阅 s3c2440 nand 控制器(以对K9F2G08U0A 256M读操作为例) (1)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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