记录编号 |
161960 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[国家集训队 2011] 拉拉队排练 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.402 s |
提交时间 |
2015-05-12 17:20:14 |
内存使用 |
171.97 MiB |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 10000010
#define A 26
#define LL long long
#define MP(x,y) make_pair(x,y)
#define mod 19930726LL
#define fir first
#define sec second
#define debug(x) cout<<#x<<" = "<<x<<endl;
using namespace std;
void file(){
freopen("rehearse.in","r",stdin);
freopen("rehearse.out","w",stdout);
}
pair<int,LL> ST[N];
int tot_S,ni;
LL K;
namespace PT{
struct node{
node *ch[A],*fail;
int len,id;
LL v;
}*now,*root[2],*pre[N];
char S[N];
int n,tot,tot_n;
void init(){
root[0]=new node(); root[1]=new node();
tot_n=0;
root[0]->id=tot_n; pre[0]=root[0];
root[1]->id=++tot_n; pre[1]=root[1];
now=root[1];
root[0]->fail=root[1]->fail=root[0];
root[0]->len=-1; root[1]->len=0;
n=0; tot=0;
S[n++]=-1;
}
node* get_node(int x){
node* tmp=new node();
tmp->id=++tot_n;
pre[tot_n]=tmp;
tmp->len=x;
return tmp;
}
node* get(node* p){
while(S[n-p->len-2]!=S[n-1])
p=p->fail;
return p;
}
bool add(char c){
int t=c-'a'; S[n++]=c;
node* p=get(now);
if(!p->ch[t]){
now=get_node(p->len+2);
if(now->len==1) now->fail=root[1];
else now->fail=get(p->fail)->ch[t];
p->ch[t]=now;
tot++;
}
now=p->ch[t];
now->v++;
return 0;
}
void count(){
tot_S=0;
for(int i=tot_n;i>=0;i--){
node* tmp=pre[i];
tmp->fail->v+=tmp->v;
if(tmp->len%2 && i>1)
ST[++tot_S]=MP(-tmp->len,tmp->v);
}
}
};
char S[N];
LL qpow(LL x,LL n){
LL ans=1;
for(;n;n>>=1,x=x*x%mod)
if(n&1) ans=ans*x%mod;
return ans;
}
int main(){
file();
scanf("%d%lld",&ni,&K);
scanf("%s",S);
LL ans=1;
PT::init();
for(int i=0;i<ni;i++) PT::add(S[i]);
PT::count();
sort(ST+1,ST+tot_S+1);
for(int i=1;K&&i<=tot_S;i++){
ST[i].sec=min(ST[i].sec,K);
// debug(ST[i].sec);
// debug(ST[i].fir);
// debug(K);
ans=ans*qpow(-ST[i].fir,ST[i].sec)%mod;
K-=ST[i].sec;
}
if(K) printf("-1\n");
else printf("%lld\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}