zoukankan      html  css  js  c++  java
  • [SOJ] 1282. Computer games (KMP)

    坑爹题

    1282. Computer Game

    Constraints

    Time Limit: 1 secs, Memory Limit: 32 MB

    Description

    Brian is an enthusiast of computer games, especially those that simulate virtual reality. Now he is in front of the Star Gate. In order to open the gate he must break the protection as quickly as he can. Breaking the protection means to match a given code (a sequence of numbers) against the gate protection (a very long sequence of numbers). The starting position of the first occurrence of the code within the sequence opens the gate. Can you help him?

    The code is a sequence of at most 60000 integer numbers between 0 and 255. The gate protection contains integer numbers between 0 and 255. Your program must find the first match if there is one, or report the absence of a match.

    Input

    The text input file contains several data sets. Each data set has the following format:

    l     the length of the code

    l     the sequence of numbers representing the code

    l     the number of integers in the gate protection

    l     the sequence of numbers representing the gate protection 

     code_dimension
    integerinteger2 … integercode_dimension 
    protection_dimension
    integerinteger2 … integerprotection_dimension

    White spaces may occur freely in the input.

    Output

    The results must be printed on the standard output. For each given data set, print the result on a separate line. The result is a number that represents the position (starting from zero) of the first occurrence of the code in the gate protection, or the message no solution if there is no match.

    Sample Input

    3
    0 1 2
    7
    2 3 4 0 1 2 5
    
    2
    1 4
    6
    4 1 4 1 4 4
    
    3
    1 2 3
    7
    3 2 1 3 2 255 7
    

    Sample Output

    3
    1
    no solution

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    int pat[1000000], text[1000000];
    int next0[1000000];
    
    void get_Next(int len2)
    {
    	int k = -1;
    	int i = 0;
    	next0[0] = -1;
    
    	while (i<len2)
    	{
    		if (k == -1 || pat[i] == pat[k])
    		{
    			k++;
    			i++;
    			next0[i] = k;
    		}
    		else
    			k = next0[k];
    	}
    }
    
    int KMP(int len1, int len2)
    {
    	int i = 0;
    	int j = 0;
    
    	get_Next(len2);
    
    	while ((i<len1) && (j<len2))
    	{
    		if (j == -1 || pat[j] == text[i])
    		{
    			i++;
    			j++;
    		}
    		else
    			j = next0[j];
    	}
    	if (j == len2)
    		return i - j;
    	return -1;
    }
    
    int main()
    {
    	int len2;
    	int len1;
    	while (scanf("%d", &len2) != EOF)
    	{
    		for (int i = 0; i < len2; i++)
    			cin >> pat[i];
    		cin >> len1;
    		for (int i = 0; i < len1; i++)
    			cin >> text[i];
    
    		int q = KMP(len1, len2);
    
    		if (q >= 0)
    			cout << q << endl;
    		else
    			cout << "no solution" << endl;
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    SAM4E单片机之旅——2、LED闪烁之轮询定时器
    SAM4E单片机之旅——1、LED闪烁之空循环
    C#使用WinAPI 修改电源设置,临时禁止笔记本合上盖子时睡眠
    阻止系统自动睡眠的小软件,附C#制作过程
    Python3做采集
    判断浏览器类型
    任意几个数求和
    常见Z纯CSS小样式合集(三角形)
    数据脱敏项目中遇见的问题
    点击左侧跳到右侧
  • 原文地址:https://www.cnblogs.com/KennyRom/p/5983032.html
Copyright © 2011-2022 走看看