soj 2307 String Matching(KMP)

来源:互联网 发布:阿里云短信api 编辑:程序博客网 时间:2024/04/29 04:31

@(K ACMer)


KMP裸题一道…


#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>#include <stack>#include <vector>#include <string>#include <queue>#include <cstdlib>#include <cmath>#include <algorithm>using namespace std;typedef pair<int, int> pii;typedef long long ll;typedef vector<int> vi;#define xx first#define yy secondconst int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e6 + 40;char s[maxn], p[maxn];int nexts[maxn], plen;void getnexts(char* p){    int k = -1, j = 0;    nexts[0] = -1;    while (j < plen - 1) {        if (k == -1 ||  p[j] == p[k]) {            k++, j++;            if (p[j] != p[k]) nexts[j] = k;            else nexts[j] = nexts[k];        } else {            k = nexts[k];        }    }}int kmp(char* s, char* p){    int ans = 0, i = 0, j = 0, slen = strlen(s);    while (i < slen) {        if (j == -1 || p[j] == s[i]) i++, j++;        else j = nexts[j];        if (j == plen - 1) ans++;    }    return ans;}int main(void) {    int T;    cin >> T;    while (T--) {        scanf("%s%s", s, p);        plen = strlen(p);        p[plen++] = '$';        p[plen] = '\0';        getnexts(p);        printf("%d\n", kmp(s, p));    }    return 0;}
0 0