Hdu-1711 Number Sequence
2011-11-11 13:49
260 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
题目大意:
从s串中如果能找出p串,则输出p串在s串的位置(两个串下标都从1开始)
解题思路:
KMP算法的简单模拟
代码如下:
题目大意:
从s串中如果能找出p串,则输出p串在s串的位置(两个串下标都从1开始)
解题思路:
KMP算法的简单模拟
代码如下:
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int s[1000010], p[10010]; int nextval[10010]; int num1, num2; void getnext(const int *p) { int i = 0, j = -1; nextval[0] = -1; while(i != num2) { if(j == -1 || p[i] == p[j]) { ++i, ++j; if(p[i] != p[j]) nextval[i] = j; else nextval[i] = nextval[j]; } else j = nextval[j]; } } int KMP(const int *s, const int *p) { int i = 0, j = 0; while(i != num1 && j != num2) { if(s[i] == p[j]) ++i, ++j; else { if(nextval[j] == -1) ++i, j = 0; else j = nextval[j]; } } if(j == num2) return i - j + 1; else return -1; } int main() { int ncase, i; int res; scanf("%d", &ncase); while(ncase--) { scanf("%d%d", &num1, &num2); for(i = 0; i < num1; ++i) scanf("%d", &s[i]); for(i = 0; i < num2; ++i) scanf("%d", &p[i]); getnext(p); res = KMP(s, p); if(res == -1) printf("-1\n"); else printf("%d\n", res); } return 0; }
相关文章推荐
- HDU - 1711 Number Sequence
- 【HDU 1711】Number Sequence(KMP)
- HDU 1711 Number Sequence(字符串匹配)
- hdu 1711 Number Sequence--KMP
- hdu 1711 Number Sequence
- HDU 1711 Number Sequence
- hdu 1711 Number Sequence(KMP入门模板题)
- hdu-1711 Number Sequence
- hdu1711——Number Sequence(KMP求位置)
- HDU 1711 Number Sequence (kmp)
- hdu 1711 Number Sequence -- (KMP 求数列第一匹配的位置)
- HDU 1711 Number Sequence(KMP)
- HDU 1711 Number Sequence
- hdu 1711 Number Sequence
- HDU 1711 Number Sequence(KMP)
- HDU 1711 Number Sequence (KMP模板题)
- HDU 1711 Number Sequence (KMP找子串第一次出现的位置)
- HDU 1711 Number Sequence
- hdu 1711 Number Sequence
- HDU 1711 Number Sequence