记录编号 533009 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队 2011] 拉拉队排练 最终得分 100
用户昵称 GravatarHale 是否通过 通过
代码语言 C++ 运行时间 1.439 s
提交时间 2019-06-11 18:24:57 内存使用 115.99 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+100,P=19930726;
struct node{
    int len,fail,son[26],siz;
};
node prt[maxn]; 
int n,last,len,num;
ll ans=1,k;
char s[maxn];
ll ksm(ll x,ll y)
{
	ll res=1;
	for (;y;y>>=1,x=x*x%P)
	if (y&1) res=res*x%P;
	return res;
}
bool cmp(node x,node y)
{
    return x.len>y.len;
}
int getfail(int x)
{
    while(s[n-prt[x].len-1]!=s[n]) x=prt[x].fail;
    return x;
}
void extend(int x)
{
    int cur=getfail(last);
    if(!prt[cur].son[x])
	{
        int now=++num;
        prt[now].len=prt[cur].len+2;
        prt[now].fail=prt[getfail(prt[cur].fail)].son[x];
        prt[cur].son[x]=now;
    }
    prt[prt[cur].son[x]].siz++;
    last=prt[cur].son[x];
}
int main()
{
    freopen("rehearse.in","r",stdin);
    freopen("rehearse.out","w",stdout);
	scanf("%d%d",&len,&k);
    scanf("%s",s);
    last=num=1,prt[1].len=-1;
    prt[0].fail=prt[1].fail=1;
    for(n=0;n<len;n++) extend(s[n]-'a');
    for(int i=num;i>=2;i--)
    prt[prt[i].fail].siz+=prt[i].siz,prt[prt[i].fail].siz%=P;
    sort(prt+1,prt+num+1,cmp);
    int now=1;
    while(k){
        if(now>num){printf("-1\n");return 0;}
        if(prt[now].len%2==0){now++;continue;}
        if(prt[now].siz<k)
		{
            k-=prt[now].siz;
            ans*=ksm(prt[now].len,prt[now].siz)%P;
            ans%=P;
            now++;
        }
        else
		{
            ans*=ksm(prt[now].len,k)%P;
            ans%=P;
            k=0;
        }
    }
    printf("%lld\n",ans);
    return 0;
}