**
航电oj:Number Sequence
**
#题目描述

#就是kmp算法 要你算最先匹配完成的那个位置
#比一般的就是用数字来代替了字母
#知识点
kmp算法
#代码
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int text[1000005];
int simple[1000005];
int Next[1000005];
int ans;
int tn,sn;
void found_next()
{
int i = 0;
int len = -1;
Next[0] = -1;
while(i < sn)
{
if(simple[len] == simple[i]||len == -1)
{
i ++;
len ++;
Next[i] = len;
}else
{
len = Next[len];
}
}
}
int kmp_search()
{
int len = 0;
int i =0;
while(i < tn)
{
//cout << text[i]<<"_________"<<simple[len]<<endl;
if(text[i] == simple[len] || len == -1)
{
i++;
len ++;
}else
{
//cout << len <<" == "<<next[len]<<endl;
len = Next[len];
}
if(len == sn)
{
return i - len +1;
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);//!!! 用cin 会超时
while(t--)
{
ans = 0;
memset(text,0,sizeof(text));
memset(simple,0,sizeof(simple));
memset(Next,0,sizeof(Next));
cin >> tn >>sn;
for(int i=0;i<tn;i++)
scanf("%d",&text[i]);//!!! 用cin 会超时
for(int i=0;i<sn;i++)
scanf("%d",&simple[i]);//!!!用cin 会超时
found_next();
// for(int i =0;i<sn;i++)
// cout<< next[i] <<endl;
cout << kmp_search() <<endl;
}
return 0;
}
#总结
如果超时有可能不是你算法的错误 有可能是cin 的所用时间大于scanf
本文介绍了如何使用KMP算法解决航空电子工程中的数列匹配问题,通过实例展示了如何计算文本中最先完成匹配的位置,以及如何通过`found_next`函数预处理简单数列的Next数组以提高搜索效率。特别提示可能存在的输入超时问题及优化技巧。
491

被折叠的 条评论
为什么被折叠?



