拉拉隊排練

Description

艾利斯頓商學院籃球隊要參加一年一度的市籃球比賽了。拉拉隊是籃球比賽的一個看點,好的拉拉隊往往能幫助球隊增加士氣,贏得最終的比賽。所以作爲拉拉隊隊長的楚雨蕁同學知道,幫助籃球隊訓練好拉拉隊有多麼的重要。拉拉隊的選拔工作已經結束,在雨蕁和校長的挑選下,n位集優秀的身材、舞技於一體的美女從衆多報名的女生中脫穎而出。這些女生將隨着籃球隊的小夥子們一起,和對手抗衡,爲艾利斯頓籃球隊加油助威。一個陽光明媚的早晨,雨蕁帶領拉拉隊的隊員們開始了排練。n個女生從左到右排成一行,每個人手中都舉了一個寫有26個小寫字母中的某一個的牌子,在比賽的時候揮舞,爲小夥子們吶喊、加油。雨蕁發現,如果連續的一段女生,有奇數個,並且他們手中的牌子所寫的字母,從左到右和從右到左讀起來一樣,那麼這一段女生就被稱作和諧小羣體。現在雨蕁想找出所有和諧小羣體,並且按照女生的個數降序排序之後,前K個和諧小羣體的女生個數的乘積是多少。由於答案可能很大,雨蕁只要你告訴她,答案除以19930726的餘數是多少就行了。

Input

輸入爲標準輸入。第一行爲兩個正整數n和K,代表的東西在題目描述中已經敘述。接下來一行爲n個字符,代表從左到右女生拿的牌子上寫的字母。

Output

輸出爲標準輸出。輸出一個整數,代表題目描述中所寫的乘積除以19930726的餘數,如果總的和諧小羣體個數小於K,輸出一個整數-1。

Sample Input
5 3
ababa

Sample Output
45

先跑遍Manacher,然後記錄各個長度的迴文串的出現次數。由於長度大的迴文串肯定包含長度小的迴文串,因此我們繼續處理一下,就可以貪心了

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;
    for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<1)+(x<<3)+ch-'0';
    return x*f;
}
inline void print(int x){
    if (x>=10)     print(x/10);
    putchar(x%10+'0');
}
const int N=1e6,P=19930726;
char s[N*2+10];
int p[N*2+10],cnt[N*2+10];
int mlt(int a,int b){
    int res=1;
    for (;b;b>>=1,a=1ll*a*a%P)  if (b&1)    res=1ll*res*a%P;
    return res;
}
int main(){
    int len=read();
    ll k;
    scanf("%lld%s",&k,s+1);
    for (int i=len;i;i--)   s[i<<1]=s[i],s[i<<1|1]='&';
    len=len<<1|1;
    s[0]='#',s[1]='&',s[len+1]='^';
    int Max=0,ID=0,ans=1;
    for (int i=1;i<=len;i++){
        p[i]=Max>i?min(p[ID*2-i],Max-i):1;
        while (s[i+p[i]]==s[i-p[i]])    p[i]++;
        if (Max<p[i]+i) Max=p[ID=i]+i;
    }
    for (int i=2;i<len;i+=2)    cnt[p[i]/2]++;
    for (int i=len/2;i;i--)     cnt[i]+=cnt[i+1];
    for (int i=len/2;i;i--){
        if (k>cnt[i])   k-=cnt[i],ans=1ll*ans*mlt(i*2-1,cnt[i])%P;
        else{
            ans=1ll*ans*mlt(i*2-1,k)%P;
            break;
        }
    }
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章