HDU 1686 裸KMP

来源:互联网 发布:英国工资 知乎 编辑:程序博客网 时间:2024/04/25 19:52

提示:

数据格式有奇怪问题,读入T以后,不能用只getchar吃回车……


当然选C++编译器可以通过


/*#include <bits/stdc++.h>#include <ext/pb_ds/priority_queue.hpp>#include <tr1/unordered_map>#include <ctime>using std::tr1::unordered_map;*/#include <iostream>#include <cstring>#include <queue>#include <algorithm>#include <cstdio>#include <map>using namespace std;/*using std::sort;using std::bitset;using std::max;using std::cout;using std::stack;using std::cin;using std::endl;using std::swap;using std::pair;using std::vector;using std::set;using std::map;using std::multiset;using std::queue;using std::greater;using std::string;using std::priority_queue;using std::max_element;using std::min_element;using __gnu_pbds::pairing_heap_tag;__gnu_pbds::priority_queue<int, greater<int>, pairing_heap_tag> heap;#define Hash unordered_map*/#define pr(x) cout<<#x<<" = "<<x<<" "#define prln(x)    cout<<#x<<" = "<<x<<endl#define lson o*2, L, M#define rson o*2+1, M + 1,R#define MAXN 1000010//pattern为模板串,从0下标,长度为len。 返回next数组template<typename T>void kmp_pre(T pattern[], int len, int next[]){next[0] = next[1] = 0;for(int i = 1 ; i < len ; i++){ int j = next[i];while(j && pattern[i] != pattern[j])j = next[j];next[i+1] = pattern[i] == pattern[j] ? j+1 : 0;}}//text为匹配串,lenT为其长度。pattern为模板串,lenP为其长度,next为上面得到的next数组。//返回一个vector,表示所有匹配成功的在text的下标(从0开始)//还返回一个true/false表示是否有匹配成功的template<typename T>bool find(T text[], int lenT, T pattern[], int lenP, int next[], vector<int> &ret)//下标皆为从0开始{  ret.clear();int j = 0; //初始化在模式串第一个位置for (int i = 0; i < lenT; ++ i){while (j && pattern[j] != text[i])j = next[j];if (pattern[j] == text[i]) j++;if (j == lenP){ret.push_back(i-lenP+1);}}return ret.size();}vector<int>ans;int nxt[1000010];char pattern[1000010], text[1000010];int main(){int T;scanf("%d\n", &T);while (T--){gets(pattern);gets(text);int lenP = strlen(pattern);int lenT = strlen(text);kmp_pre(pattern, lenP, nxt);find(text, lenT, pattern, lenP, nxt, ans);printf("%d\n", ans.size());}return 0;}


0 0