有時KMP簡單應用,不解釋。
#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 200005#define MOD 10007char str[N];int p[N];int n;void gao() { int i,j = 0; p[1] = 0; for (i = 2; i <= n; i++) { while (j > 0 && str[i] != str[j+1]) { j =p[j]; } if (str[i] == str[j+1]) j++; p[i] = j; } int sum = 0; for (i = n; i >= 1; i --) { int cnt = 1; j = p[i]; while (j) { cnt++; j = p[j]; } sum = (sum + cnt) % MOD; } printf("%d\n",sum%MOD);}int main () { int t; scanf("%d",&t); while (t--) { scanf("%d",&n); int i; scanf("%s",str+1); gao(); } return 0;}