//pattern為模板串,從0下標,長度為len。 返回next陣列
templatevoid kmp_pre(t pattern, int len, int next)
}//text為匹配串,lent為其長度。pattern為模板串,lenp為其長度,next為上面得到的next陣列。
//返回乙個vector,表示所有匹配成功的在text的下標(從0開始)
//還返回乙個true/false表示是否有匹配成功的
vectorret;
templatebool find(t text, int lent, t pattern, int lenp, int next, vector&ret)//下標皆為從0開始
} return ret.size();
}
上述為模板
ac code
#include #include #include #include using std::tr1::unordered_map;
/*#include #include #include #include #include #include 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, pairing_heap_tag> heap;
#define hash unordered_map
#define pr(x) cout<<#x<<" = "}//text為匹配串,lent為其長度。pattern為模板串,lenp為其長度,next為上面得到的next陣列。
//返回乙個vector,表示所有匹配成功的在text的下標(從0開始)
//還返回乙個true/false表示是否有匹配成功的
vectorret;
templatebool find(t text, int lent, t pattern, int lenp, int next, vector&ret)//下標皆為從0開始
} return ret.size();
}int pattern[10010], text[1000010], nxt[10010];
void init()
int main()
return 0;
}
1015 KMP演算法 裸kmp
第一行乙個整數n,表示測試資料組數。接下來的n 2行,每兩行表示乙個測試資料。在每乙個測試資料中,第一行為模式串,由不超過10 4個大寫字母組成,第二行為原串,由不超過10 6個大寫字母組成。其中n 20 對於每乙個測試資料,按照它們在輸入中出現的順序輸出一行ans,表示模式串在原串中出現的次數。i...
HDU 2087 減花布條 裸KMP模板
中文題面,題意也說得非常清楚了,給乙個文字串,求文字串中有多少個不重複的模式串 kmp標準做法,甚至基本沒有變動。判斷的時候,每當完整的匹配一次之後令j 0,ans 即模式串的下標從0開始,匹配數量加1 include include include include include include ...
hdu 4300(kmp或者拓展kmp)
題意 亂七八糟說了一大堆,就是先給你乙個長度26的字串,對應了abcd.xyz,這是乙個密碼表。然後給你乙個字串,這個字串是不完整的 完整的應該是前半部分是加密的,後半部分是解密了的 然而,給你的字串一定是加密的部分 一部分解密的部分 可以是全部,也可以是沒有 讓你求出最短的完整字串 解題思路 考慮...