zoukankan      html  css  js  c++  java
  • 【字符串入门专题1】 I



    Number Sequence

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 28715    Accepted Submission(s): 12063


    Problem Description
    Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are more than one K exist, output the smallest one.
     

    Input
    The first line of input is a number T which indicate the number of cases. Each case contains three lines. The first line is two numbers N and M (1 <= M <= 10000, 1 <= N <= 1000000). The second line contains N integers which indicate a[1], a[2], ...... , a[N]. The third line contains M integers which indicate b[1], b[2], ...... , b[M]. All integers are in the range of [-1000000, 1000000].
     

    Output
    For each test case, you should output one line which only contain K described above. If no such K exists, output -1 instead.
     

    Sample Input
    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
     

    Sample Output
    6 -1
     
    题意:找到s2在s1中第一次出现的位置,没有找到输出-1

    思路:kmp稍微变形一下,依然可以用来处理数字字符串,只要找到s1中出现s2就直接返回下标,若在循环内没找到,在循环结束后判断s2是不是s1的后缀就行了

    
    #include<stdio.h>
    #define inf 99999999
    #define N 1100000
    #define M 11000
    int a[N],b[M];
    int next[M];
    
    int kmp(int a[],int b[],int next[])//找到s2第一次在s1中出现的位置 
    {
    	int j,k,i;
    	j = 0;
    	k = -1;
    	next[0] = -1;
    	while(b[j]!=inf)//建立next数组 
    	{
    		while(k!=-1&&b[k]!=b[j])
    		{
    			k = next[k];
    		}
    			
    		j++;
    		k++;
    		if(b[k]!=b[j])
    			next[j] = k;
    		else
    			next[j] = next[k];
    	}
    	i = j = 0;
    	while(a[i]!=inf)
    	{
    		if(b[j] == inf)
    			return i-j+1;//第一次出现就返回在s1中的下标 
    		else
    		{
    			while(j != -1&&a[i]!=b[j])
    				j = next[j];
    			i++;
    			j++;
    		}
    	}
    	if(b[j] == inf)//判断s2是否为s1数组的后缀 
    		return i-j+1;
    	return -1;//不存在返回-1 
    }
    
    int main()
    {
    	int t,i,j,n,m;
    	scanf("%d",&t);
    	while(t --)
    	{
    		scanf("%d%d",&n,&m);
    		for(i = 0; i < n; i ++)
    			scanf("%d",&a[i]);
    		for(j = 0; j < m; j++)
    			scanf("%d",&b[j]);
    		a[i] = b[j] = inf;//设置截止符 
    		
    		printf("%d
    ",kmp(a,b,next));
    	}
    	return 0;
    }


  • 相关阅读:
    Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
    DHCP "No subnet declaration for xxx (no IPv4 addresses)" 报错
    Centos安装前端开发常用软件
    kubernetes学习笔记之十:RBAC(二)
    k8s学习笔记之StorageClass+NFS
    k8s学习笔记之ConfigMap和Secret
    k8s笔记之chartmuseum搭建
    K8S集群集成harbor(1.9.3)服务并配置HTTPS
    Docker镜像仓库Harbor1.7.0搭建及配置
    Nginx自建SSL证书部署HTTPS网站
  • 原文地址:https://www.cnblogs.com/hellocheng/p/7350068.html
Copyright © 2011-2022 走看看