hdu 1711

读入优化有3s多。

 1 #include <cstdio>
 2 #include <cctype>
 3 #define maxn 1000010
 4 #define maxm 10010
 5
 6 int n, m;
 7 int aa[maxn], bb[maxm], f[maxm];
 8
 9 void gn( int &rt ) {
10     char ch;
11     char opt;
12     while( !isdigit(ch=getchar()) ) opt=ch;
13     rt=ch-‘0‘;
14     while( isdigit(ch=getchar()) )
15         rt=rt*10+ch-‘0‘;
16     if( opt==‘-‘ ) rt=-rt;
17 }
18
19 void getfail() {
20     f[0] = f[1] = 0;
21     for( int i=1, j; i<m; i++ ) {
22         j = f[i];
23         while( j && bb[i]!=bb[j] ) j=f[j];
24         f[i+1] = bb[i]==bb[j] ? j+1 : 0;
25     }
26 }
27 int kmp() {
28     for( int i=0,j=0; i<n; i++ ) {
29         while( j && aa[i]!=bb[j] ) j=f[j];
30         if( aa[i]==bb[j] ) j++;
31         if( j==m ) return i-m+2;
32     }
33     return -1;
34 }
35
36 int main() {
37     int T;
38     scanf( "%d", &T );
39     while( T-- ) {
40         scanf( "%d%d", &n, &m );
41         for( int i=0; i<n; i++ )
42             gn(aa[i]);
43         for( int i=0; i<m; i++ )
44             gn(bb[i]);
45         getfail();
46         printf( "%d\n", kmp() );
47     }
48 }

(注意,getfail()中f[i+1] = P[i]==P[j] ? j+1 : 0;)

时间: 2024-10-17 01:51:49

hdu 1711的相关文章

KMP算法的定义及KMP练手题 HDU 1711 Number Sequence (我的模板代码)

题意:就是要你来找出b数组在a数组中最先匹配的位置,如果没有则输出-1 思路:直接KMP算法(算法具体思想这位牛写的不错http://blog.csdn.net/v_july_v/article/details/7041827) AC代码: #include<cstdio> #include<cstring> #include<stdlib.h> #include<iostream> using namespace std; #define maxn 100

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

hdu 1711 Number Sequence(KMP)

# include <stdio.h> # include <string.h> # include <algorithm> using namespace std; int n,m,next[10010],a[1000010],b[10010]; void Getnext() { int i=0,j=-1; next[0]=-1; while(i<m) { if(j==-1||b[i]==b[j]) i++,j++,next[i]=j; else j=next[

HDU 1711 Number Sequence KMP题解

KMP查找整数数列,不是查找字符串. 原理是一样的,不过把字符串转换为数列,其他基本上是一样的. #include <stdio.h> #include <string.h> const int MAX_N = 1000001; const int MAX_M = 10001; int strN[MAX_N], strM[MAX_M], next[MAX_M], N, M; void getNext() { memset(next, 0, sizeof(int) * M); for

HDU - 1711 Number Sequence KMP字符串匹配

HDU - 1711 Number Sequence Time Limit: 5000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <=

hdu 1711 KMP模板题

// hdu 1711 KMP模板题 // 贴个KMP模板吧~~~ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAX_N = 1000008; const int MAX_M = 10008; int T[MAX_N]; int p[MAX_M]; int f[MAX_M]; int

HDU 1711 Number Sequence(字符串匹配)

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10571    Accepted Submission(s): 4814 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1],

hdu 1711 Number Sequence 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目意思:给出一条有n个数的序列a[1],a[2],......,a[n],和一条有m 个数的序列b[1],b[2],......,b[m],求出b[1],b[2],...,b[m]在序列a中完全匹配时,在序列a中的位置,如果找不到输出-1. 这几天一直在学kmp,该题算是kmp的入门题吧.有个地方要稍稍注意,代码中,主串和模式串的比较初始值为-1,-1,否则如果从0开始,会默认第一个字符是相

KMP算法 hdu 1711 hdu 2203

mark一下,重新温习了 KMP KMP复杂度O(n+m) 这里有一个解释的超级的好的博客,大家可以去看一下:http://blog.csdn.net/v_july_v/article/details/7041827 换言之,对于给定的模式串:ABCDABD,它的最大长度表及next 数组分别如下: 根据最大长度表求出了next 数组后,从而有 失配时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值 void GetNext(char* p,int next[]) {

HDU - 1711 A - Number Sequence(kmp

HDU - 1711 A - Number Sequence 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[