传送门:题目
题解:
纯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;
}