kuangbin专题16A(kmp模板)
2017-08-09 19:34
288 查看
题目链接: https://vjudge.net/contest/70325#problem/A
题意: 有两个数组 a, b, 输出 b 数组在 a 数组中的第一个匹配位置, 不能匹配则输出 -1.
思路: kmp模板
代码:
View Code
题意: 有两个数组 a, b, 输出 b 数组在 a 数组中的第一个匹配位置, 不能匹配则输出 -1.
思路: kmp模板
代码:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int MAXN = 1e6 + 10; 7 int a[MAXN], b[MAXN], nex[MAXN]; 8 int n, m; 9 10 void get_next(int *b){ 11 nex[0] = 0; 12 for(int i = 1; i < m; i++){ 13 int j = nex[i]; 14 while(j && b[j] != b[i]){ 15 j = nex[j]; 16 } 17 nex[i + 1] = j + (b[i] == b[j]); 18 } 19 } 20 21 int kmp(int *a, int *b){ 22 get_next(b); 23 for(int i = 0, j = 0; i < n; i++){ 24 while(j && a[i] != b[j]){ 25 j = nex[j]; 26 } 27 if(a[i] == b[j]) j++; 28 if(j == m) return i - m + 2; 29 } 30 return -1; 31 } 32 33 int main(void){ 34 int t; 35 scanf("%d", &t); 36 while(t--){ 37 memset(nex, 0, sizeof(nex)); 38 scanf("%d%d", &n, &m); 39 for(int i = 0; i < n; i++){ 40 scanf("%d", &a[i]); 41 } 42 for(int i = 0; i < m; i++){ 43 scanf("%d", &b[i]); 44 } 45 int sol = kmp(a, b); 46 printf("%d\n", sol); 47 } 48 return 0; 49 }
View Code
相关文章推荐
- kuangbin专题十六 HUD2087 KMP模板题
- kuangbin专题十四 POJ2478 欧拉函数模板题
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher B HDU 1686
- kuangbin专题十七 HDU2896 病毒侵袭(AC自动机模板题)
- kuangbin专题十六 HDU1686 KMP理解
- kuangbin专题七:A题 HDU 1166 敌兵布阵(单点更新,区域查询求和的线段树模板)
- kuangbin专题十九 矩阵倍增法模板题
- [kuangbin带你飞]专题六 最小生成树 (prim)(kruskal)(模板)
- kuangbin专题十六 HDU3746 判断KMP循环节和补齐循环节
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher A HDU 1711
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J HDU 2594
- kuangbin专题十 HDU2255 KM算法模板
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher J (kmp扩展)
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher L(kmp扩展)
- leetcode oj 28 字符串匹配 kmp 下标从0开始 kuangbin模板
- kuangbin专题十六 HDU1358 求KMP循环次数
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher K HDU 3336
- [kuangbin带你飞]专题十六 KMP & 扩展KMP
- kuangbin专题十 HDU2389(Hopcroft-Carp的算法模板)
- kuangbin专题十六 POJ2406 KMP循环节次数