首页 > 代码库 > KMP 模板
KMP 模板
模板-KMP
#include <vector> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; namespace _kmp { #define foreach(i, l, r) for(int i = (l); i < (r); ++i) typedef vector < pair<int, int> > AA; const int N = 100000 + 5; int next[N]; void init(const char *obj, int lo) { next[0] = -1; int j = -1; //represent can match [0, j] at most. foreach(i, 1, lo) { while(j != -1 && obj[j + 1] != obj[i]) { j = next[j]; } if(obj[j + 1] == obj[i]) { next[i] = ++j; } else { next[i] = j; } } } AA match(const char *me, int lm, const char *obj, int lo) { AA ret; int j = -1; //represent can match [0, j] at most. foreach(i, 0, lm) { while(j != -1 && obj[j + 1] != me[i]) { j = next[j]; } if(obj[j + 1] == me[i]) { if(++j == lo - 1) { ret.push_back(make_pair(i - j, i)); } } } return ret; } #undef foreach(i, l, r) } int main() { char me[] = "abababaababa"; char obj[] = "aba"; _kmp::init(obj, strlen(obj)); _kmp::AA ret = _kmp::match(me, strlen(me), obj, strlen(obj)); for(int i = 0; i < (int)ret.size(); ++i) { printf("{%d,%d}\n", ret[i].first, ret[i].second); } return 0; }
KMP 模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。