题目描述
艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了. 拉拉队是篮球比赛的一个看点, 好的拉拉队往往能帮助球队增加士气, 赢得最终的比赛. 所以作为拉拉队队长的楚雨荨同学知道, 帮助篮球队训练好拉拉队有多么的重要.
拉拉队的选拔工作已经结束, 在雨荨和校长的挑选下, n 位集优秀的身材, 舞技于一体的美女从众多报名的女生中脱颖而出. 这些女生将随着篮球队的小伙子们一起, 和对手抗衡, 为艾利斯顿篮球队加油助威.
一个阳光明媚的早晨, 雨荨带领拉拉队的队员们开始了排练. n 个女生从左到右排成一行, 每个人手中都举了一个写有 26 个小写字母中的某一个的牌子, 在比赛的时候挥舞, 为小伙子们呐喊, 加油.
雨荨发现, 如果连续的一段女生, 有奇数个, 并且他们手中的牌子所写的字母, 从左到右和从右到左读起来一样, 那么这一段女生就被称作和谐小群体.
现在雨荨想找出所有和谐小群体, 并且按照女生的个数降序排序之后, 前 K 个和谐小群体的女生个数的乘积是多少. 由于答案可能很大, 雨荨只要你告诉她, 答案除以 19930726 的余数是多少就行了.
输入输出格式
输入格式:
输入为标准输入.
第一行为两个正整数 n 和 K, 代表的东西在题目描述中已经叙述.
接下来一行为 n 个字符, 代表从左到右女生拿的牌子上写的字母.
输出格式:
输出为标准输出.
输出一个整数, 代表题目描述中所写的乘积除以 19930726 的余数, 如果总的和谐小群体个数小于 K, 输出一个整数 - 1.
输入输出样例
输入样例 #1: 复制 5 3 ababa
输出样例 #1: 复制
45
说明
样例说明
和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为 ababa, aba, aba, bab, a, a, a, b, b, 前三个长度的乘积为 .
数据范围与约定
测试点 | n | K |
---|---|---|
1 | 10 | 10 |
2-3 | 100 | 100 |
4-7 | 1,000 | 1,000 |
8 | 100,000 | = 1 |
9-11 | 100,000 | 100,000 |
12-14 | 100,000 | 1,000,000,000,000 |
15-17 | 500,000 | 1,000,000,000,000 |
18 | 1,000,000 | = 1 |
19 | 1,000,000 | 1,000,000 |
20 | 1,000,000 | 1,000,000,000,000 |
[扯谈]
所以到底是拉拉队还是啦啦队啊???!!!
在网上找了篇解释:
拉拉队 "是指" 进行竞技比赛时, 为参赛者呐喊助威的有组织的观众队伍 ". 例如:
这时候, 拉拉队又吹喇叭又敲锣鼓, 为中国队加油.
"拉拉队" 和 "啦啦队" 两种写法都有, 在以往的作品中都能看到. 目前, 权威工具书一般推荐 "拉拉队" 的写法. 所以,"拉拉队" 是规范词形, 应当采用.
拉拉队是以团队的形式出现, 并结合舞蹈, 口号, 舞伴特技, 是指托举的难度动作, 技巧等动作技术, 配合音乐, 服装, 队型变化及标示物品 (如彩球, 口号板, 喇叭与旗帜) 等要素, 遵守比赛规则中对性别, 人数, 时间限制, 安全规则等规定进行比赛的运动, 称之为竞技拉拉队, 亦可称为拉拉队.
不管是什么队, 反正里面的小姐姐一定很好看...
[思路分析]
回到正题, 这是一道回文自动机的板题, 我们只需要找出所有回文串比较一下贡献值, 再判一下长度是不是为奇数就行.
[代码实现]
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int N=1e6+5,mod=19930726;
- struct sd{
- int son[26],fail,len,num;
- }t[N];
- char st[N];
- int n,cnt=-1,id,last;
- long long ans=1,k;
- long long ksm(long long v,int b)
- {
- long long base=v,res=1;
- while(b)
- {
- if(b&1) res=res*base%mod;
- base=base*base%mod;
- b=b>>1;
- }
- return res;
- }
- int get_fail(int v)
- {
- while(st[id-t[v].len-1]!=st[id]) v=t[v].fail;
- return v;
- }
- void insert(char ch)
- {
- id++;
- int v=ch-'a';
- int fa=get_fail(last);
- if(!t[fa].son[v])
- {
- t[fa].son[v]=++cnt;
- t[cnt].len=t[fa].len+2;
- t[cnt].fail=t[get_fail(t[fa].fail)].son[v];
- if(t[cnt].fail==cnt) t[cnt].fail=0;
- }
- last=t[fa].son[v];
- t[last].num++;
- }
- bool cmp(sd a,sd b)
- {
- return a.len>b.len;
- }
- int main()
- {
- t[++cnt].fail=1;
- t[++cnt].len=-1;
- scanf("%d%lld",&n,&k);
- scanf("%s",st+1);
- for(int i=1;i<=n;i++)
- insert(st[i]);
- for(int i=cnt;i>=2;i--)
- t[t[i].fail].num+=t[i].num;
- sort(t+2,t+1+cnt,cmp);
- for(int i=2;i<=cnt;i++)
- {
- if(!k) break;
- if(t[i].len%2)
- if(t[i].num>k)
- {
- ans=ans*ksm(t[i].len,k)%mod;
- k=0;
- break;
- }
- else
- {
- k-=t[i].num;
- ans=ans*ksm(t[i].len,t[i].num)%mod;
- }
- }
- if(k>0) printf("-1");
- else printf("%lld",ans);
- return 0;
- }
来源: http://www.bubuko.com/infodetail-2694903.html