hdu 1711 Number Sequence
http://acm.hdu.edu.cn/showproblem.php?pid=1711
问题描述:字符串首次匹配位置
暴力复杂度O(n×m),无谓的比较过多;kmp算法能优化到O(n+m),直接套板
思路
kmp串匹配O(n+m)
参考代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
#include<sstream>
#define eps 1e-9
#define pi acos(-1)
#define long long ll
using namespace std;
const int _max = 5e4 + 10;
int n,m;
int a[1000100],b[10010];
int Next[10010];//大小取决模式串m
void getNext(){//预处理
int i = 0;
int j = Next[0] = -1;
while(i < m){
if(0 > j||b[i] == b[j]) Next[++i] = ++ j;
else j = Next[j];
}
}
int kmp(){//首次匹配成功位置,b是模式串,a是主串,类型不限,
getNext();
int i = 0,j = 0;
while(j < m&& i < n){
if(0 > j||a[i] == b[j]) i++,j++;
else j = Next[j];
}
return i - j;//i-j>n-m匹配失败,成功返回初始匹配位置
}
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif // ONLINE_JUDGE
int T;cin>>T;
while(T--){
scanf("%d%d",&n,&m);
for(int i = 0; i < n; ++ i) scanf("%d",a+i);
for(int i = 0; i < m; ++ i) scanf("%d",b+i);
int tar = kmp();
if(tar>n-m) puts("-1");else printf("%d\n",tar+1);
}
return 0;
}
- 加粗
Ctrl + B
- 斜体
Ctrl + I
- 引用
Ctrl + Q
- 插入链接
Ctrl + L
- 插入代码
Ctrl + K
- 插入图片
Ctrl + G
- 提升标题
Ctrl + H
- 有序列表
Ctrl + O
- 无序列表
Ctrl + U
- 横线
Ctrl + R
- 撤销
Ctrl + Z
- 重做
Ctrl + Y