题意:求一个串有多少个字串不含长度至少为k的回文串
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
#define FRER() freopen("in.txt","r",stdin)
#define FREW() freopen("out.txt","w",stdout)
#define go int T;cin>>T;for(int kase=0;kase<T;kase++)
#define debug cout<<"****************"<<endl
#define lowbit(x) x&(-x)
#define eps 1e-6
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int maxn = 1000000 + 7;
int Next[maxn],ex[maxn];
template <class T> T gcd(T a,T b){return !b?a:gcd(b,a%b);}
char str[maxn];
char s[maxn<<1];
ll len[maxn<<1];
void Init(){
int len = (int)strlen(str);
s[0] = '@';
for(int i=1;i<=len*2;i+=2){
s[i] = '#';
s[i+1] = str[i/2];
}
s[2*len+1] = '#';
s[2*len+2] = '$';
s[2*len+3] = 0;
}
void Manacher(){
int l = (int)strlen(s);
ll mx = 0 , po = 0;
for(int i=1;i<=l;i++){
if(mx>i) len[i] = min(len[2*po-i],(ll)mx-i);
else
len[i] = 1;
while(s[i-len[i]]==s[i+len[i]]) len[i]++;
if(len[i]+i>mx){
mx = len[i]+(ll)i;
po = i;
}
}
}
int t[maxn];
void add(int st,int v,int n){while(st<=n){t[st]=max(t[st],v);st+=lowbit(st);}}
int query(int st){int ans = 0;while(st>=1){ans=max(ans,t[st]);st-=lowbit(st);}return ans;}
int main(){
//FRER();
//FREW();
int k ;
go{
scanf("%d",&k);
scanf("%s",str);
memset(t, 0, sizeof(t));
Init();
Manacher();
int _len = (int)strlen(str);
int l = 2*_len+1;
for(int i=2;i<l;i++){
if(len[i]-1<k) continue;
int st,ed,tmp = k;
if(tmp%2!=(len[i]-1)%2) tmp++;
if(i%2==0){
ed = i/2 + tmp/2;
st = i/2 - tmp/2;
}else{
ed = (i-1)/2+tmp/2;
st = (i+1)/2-tmp/2;
}
add(ed, st, _len);
}
ll ans = 0;
for(int i=1;i<=_len;i++) ans += (ll)(i-query(i));
cout<<ans<<endl;
}
return 0;
}