Chinaunix首页 | 论坛 | 博客
  • 博客访问: 49070
  • 博文数量: 45
  • 博客积分: 1112
  • 博客等级: 少尉
  • 技术积分: 575
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-03 11:47
文章分类

全部博文(45)

文章存档

2013年(45)

我的朋友

分类: C/C++

2013-01-12 13:51:53

kmp 很好,要熟练
  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <vector>
  8. #include <stack>
  9. #include <deque>
  10. #include <queue>
  11. #include <bitset>
  12. #include <list>
  13. #include <map>
  14. #include <set>
  15. #include <iterator>
  16. #include <algorithm>
  17. #include <functional>
  18. #include <utility>
  19. #include <sstream>
  20. #include <climits>
  21. #include <cassert>
  22. #define BUG puts("here!!!");

  23. using namespace std;
  24. const int N = 1000005;
  25. const int M = 10005;

  26. int s[N];
  27. int t[M];
  28. int next[M];
  29. void getNext(int len) {
  30.     int i, j;
  31.     i = 0, j = -1;
  32.     next[0] = -1;
  33.     while(i < len-1) {
  34.         if(j == -1 || t[i] == t[j]) {
  35.             i++, j++, next[i] = j;
  36.         }
  37.         else {
  38.             j = next[j];
  39.         }
  40.     }
  41. }
  42. int kmp(int sl, int tl) {
  43.     int i = 0, j = 0;
  44.     while(i < sl && j < tl) {
  45.         if(j == -1 || s[i] == t[j]) {
  46.             i++, j++;
  47.         }
  48.         else j = next[j];
  49.     }
  50.     if(j == tl) return i-j+1;
  51.     else return -1;
  52. }
  53. // abcabcababcabcabdef
  54. // abcabcabd
  55. int main() {
  56.     int T, n, m, ans;
  57.     cin >> T;
  58.     while(T--) {
  59.         cin >> n >> m;
  60.         for(int i = 0; i < n; i++) {
  61.             scanf("%d", s+i);
  62.         }
  63.         for(int i = 0; i < m; i++) {
  64.             scanf("%d", t+i);
  65.         }
  66.         getNext(m);
  67.         ans = kmp(n, m);
  68.         cout << ans << endl;
  69.     }
  70.     return 0;
  71. }

阅读(276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~