void work(char *s1, char *s2) { int l1 = strlen(s1); int l2 = strlen(s2); for (int i = 1; i <= l2; i++) s[i] = s2[i-1]; for (int i = 1; i <= l1; i++) s[i+l2] = s1[i-1]; init_kmp(s, l1 + l2, p); if (p[l1+l2] < len) return; if (p[l1+l2] >= l1 || p[l1+l2] >= l2) { if (l1 > l2) { if (len < p[l1+l2] || strcmp(ans, s1) > 0) strcpy(ans, s1); } else { if (len < p[l1+l2] || strcmp(ans, s2) > 0) strcpy(ans, s2); } } else { strcpy(tmp, s1); strcpy(tmp+l1, s2+p[l1+l2]); if (len < p[l1+l2] || strcmp(ans, tmp) > 0) strcpy(ans, tmp); } if (len < p[l1+l2]) len = p[l1+l2]; }
ll naive(ll l, ll r) { ll ans = 0; for (ll x = l; x <= r; ++x) { string s = b2s(x); int n = s.length(), k = init_kmp(s); if (k < n && n % k == 0) { cerr << " " << s << endl; ans += 1; } } return ans; }
int main() { int t; scanf("%d", &t); while (t--) { int n; scanf("%d", &n); scanf("%s", s+1); init_kmp(s, n); memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) dp[p[i]]++; for (int i = n; i >= 1; i--) { dp[p[i]] = (dp[p[i]] + dp[i]) % MOD; } int ans = 0; for (int i = 1; i <= n; i++) ans = (ans + dp[i]) % MOD; ans = (ans + n) % MOD; printf("%d\n", ans); } return 0; }
static int __init init(void) { init_bm(); init_kmp(); return ipt_register_match(&string_match); }