**
航电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