建立回文树以后直接sort以后暴力跑就好了,不会有问题的。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define Mod 19930726ll
#define maxn 1000021
#define LL long long
using namespace std;
int n,cnt[maxn],s[maxn],fail[maxn],ch[maxn][26];
int len[maxn],N,p,last,tot;
LL K;
char ss[maxn];
int get(int x){
while(s[n]!=s[n-len[x]-1])x=fail[x];
return x;
}
void insert(int c){
s[++n]=c;
int cur=get(last);
if(!ch[cur][c]){
len[p]=len[cur]+2;
fail[p]=ch[get(fail[cur])][c];
ch[cur][c]=p++;
}
last=ch[cur][c];
cnt[last]++;
}
struct node{
int len,cnt;
node(int a=0,int b=0):len(a),cnt(b){}
bool operator<(const node& b)const{return len > b.len;}
}a[maxn];
int mull(int x,int y){
int ans=1;
for(;y;y>>=1){
if(y&1)ans=(LL)ans*x%Mod;
x=(LL)x*x%Mod;
}return ans;
}
int main(){
scanf("%d%lld%s",&N,&K,ss);
s[0]=-1;p=2;
len[1]=-1;fail[0]=1;
for(int i=0;i<N;i++)insert(ss[i]-'a');
for(int i=p-1;i>1;i--)cnt[fail[i]]+=cnt[i];
for(int i=2;i<p;i++)
if(len[i]&1)a[++tot]=node(len[i],cnt[i]);
sort(a+1,a+tot+1);
int now=1;LL ans=1;
while(K&&now<=tot){
if(K>=a[now].cnt){
K-=a[now].cnt;
ans=ans*mull(a[now].len,a[now].cnt)%Mod;
}else{
ans=ans*mull(a[now].len,K)%Mod;
K=0;
}
now++;
}
if(K){puts("-1");return 0;}
printf("%lld",ans);
return 0;
}