3311-数据结构实验之串三:KMP应用
2017-10-29 17:21
483 查看
#include <bits/stdc++.h> #define MAX 1000000 using namespace std; int next[MAX]; char s[MAX]; char p[MAX]; void GetNext(); /// 获取next数组 void Kmp(); int main() { int n,m; cin >> n; for(int i = 0; i < n; i++) { cin >> s[i]; } cin >> m; for(int i = 0; i < m; i++) { cin >> p[i]; } Kmp(); return 0; } void GetNext() { int k = -1; int j = 0; next[0] = -1; int len = strlen(p); while(j < len-1) { if(k == -1 || p[j] == p[k]) { ///next[++j] = ++k; /// 以上可写为 ++k; ++j; next[j] = k; } else { k = next[k]; } } } void Kmp() { GetNext(); int len1 = strlen(s); int len2 = strlen(p); int i = 0; int j = 0; int cnt = 0; int k; /// 存i的位置 while(i < len1) { if(j == -1 || s[i] == p[j]) { i++; j++; if(j == len2) ///如果存在完全匹配成功 { cnt++; if(cnt == 1) { k = i; } j = 0; /// 智商请上线!!! i = i - len2 + 1; ///S就不是从新开始~从上一次匹配的头的下一位置 if(cnt == 2) { break; } } } else { j = next[j]; /// 回溯到j失配的位置 } } if(cnt == 1) { cout << k - len2 + 1 << " " << k << endl; } else { cout << "-1" << endl; /// 我的脑子是被吃掉了吗??? } }
相关文章推荐
- sdut 3311 数据结构实验之串三:KMP应用
- SDUTOJ(3311)数据结构实验之串三:KMP应用
- [SDUT](3311)数据结构实验之串三:KMP应用 ---KMP(串)
- SDUT 3311 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用 sdut(oj 3311)
- 3311 数据结构实验之串三:KMP应用
- SDUT_3311_数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- <sdut-ACM>数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- SDUT 2772 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串一:KMP简单应用
- 数据结构实验之串三:KMP应用
- 数据结构实验之串三:KMP应用