hdu 1711Number Sequence

本文介绍了一种使用KMP算法解决数字模式匹配问题的方法。通过具体实现代码,展示了如何为模式串构造next数组,并利用该数组进行高效匹配,最终返回模式在目标串中首次出现的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711

数字KMP,原来还能这么用

 1 #include<stdio.h>
 2 int a[1000010],b[10010];
 3 int next[10010];
 4 int n,m;
 5 void getNext()
 6 {
 7     int j,k;
 8     j=0;
 9     k=-1;
10     next[0]=-1;
11     while(j<m)
12     {
13         if(k==-1||b[j]==b[k])
14           next[++j]=++k;
15         else k=next[k];
16     }    
17 }  
18 //返回首次出现的位置 
19 int KMP_Index()
20 {
21     int i=0,j=0;
22     getNext();
23     
24     while(i<n && j<m)
25     {
26         if(j==-1||a[i]==b[j])
27         {
28             i++;
29             j++;
30         }    
31         else j=next[j];
32         
33     }    
34     if(j==m) return i-m+1;
35     else return -1;
36 }      
37 int main()
38 {
39     int T;
40     scanf("%d",&T);
41     while(T--)
42     {
43         scanf("%d%d",&n,&m);
44         for(int i=0;i<n;i++)
45           scanf("%d",&a[i]);
46         for(int i=0;i<m;i++)
47           scanf("%d",&b[i]);
48         printf("%d\n",KMP_Index());
49     }    
50     return 0;
51 }

 

转载于:https://www.cnblogs.com/pter/p/5691434.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值