首页 > 其他 > 详细

hdu 1711

时间:2015-03-10 20:59:34      阅读:209      评论:0      收藏:0      [点我收藏+]

 

读入优化有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 }
View Code

 

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

hdu 1711

原文:http://www.cnblogs.com/idy002/p/4328275.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!