HDU 3336 KMP的next数组

传送门:题目

题解:

纯KMP,考的就是KMP中next数组的具体含义。
如果不理解next,可以参考这篇博客:KMP中next数组含义

AC代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
#define MOD 10007
using namespace std;
const int maxn = 200010;
int KMP_next[maxn];
void kmp_pre(char x[], int m, int KMP_next[]) {//kmp未优化版
    //如果多次使用KMP,不需要对next  memset
    //abab  -> next={-1,0,0,1,2};
    int i = 0, j = KMP_next[0] = -1;
    while (i < m) {
        while (j != -1 && x[i] != x[j])
            j = KMP_next[j];
        KMP_next[++i] = ++j;
    }
}
int main(void) {
    int T;
    cin >> T;
    while (T--) {
        char s[maxn];
        int len, ans;
        cin >> len >> s;
        ans = len;
        kmp_pre(s, len, KMP_next);
        for (int i = 1; i <= len; i++) {
            int temp = KMP_next[i];
            while (temp != 0) {
                ans = (ans + 1) % MOD;
                temp = KMP_next[temp];
            }
        }
        cout << ans << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/shadandeajian/article/details/81587218
今日推荐