KMP模板题 Number Sequence HDU1711

模板...嗯

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string.h>
 4 #pragma warning ( disable : 4996 )
 5 using namespace std;
 6 
 7 const int inf = 0x3f3f3f3f;
 8 const int maxn = 1e4+5;
 9 const int vspot = 1e6+5;
10 
11 int net[maxn];
12 int num[maxn], test[vspot];
13 int N, M, ans;
14 
15 void getnext()
16 {
17     memset( net, 0, sizeof(net) );
18     ans = 0;
19     int len = M;
20 
21     int k = -1, j = 0;
22     net[j] = -1;
23 
24     while ( j < len-1 )
25     {
26         if ( k==-1 || num[j]==num[k] )
27         {
28             k++;
29             j++;
30             net[j] = k;
31         }
32         else
33             k = net[k];
34     }
35 }
36 
37 void solve()
38 {
39     int i = 0, j = 0;
40     while ( i < N && j < M )
41     {
42         if( j == -1 || test[i] == num[j] )
43         { i++; j++; }
44         else
45             j = net[j];
46     }
47     if( j == M )
48         ans = i-j+1;
49     else
50         ans = -1;
51 }
52 
53 int main()
54 {
55     int all;
56     cin >> all;
57     while (all--)
58     {
59         cin >> N >> M;
60         for( int i = 0; i < N; i++ )
61             scanf( "%d", &test[i] ); 
62         for( int i = 0; i < M; i++ )
63             scanf( "%d", &num[i] ); 
64 
65         getnext();
66         solve();
67         printf( "%d\n", ans );
68     }
69     return 0;
70 }
View Code

 

转载于:https://www.cnblogs.com/chaoswr/p/8617442.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值