[回文树][BZOJ2160][国家集训队]拉拉队排练
题面
Description
艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多么的重要。拉拉队的选拔工作已经结束,在雨荨和校长的挑选下,\(n\)位集优秀的身材、舞技于一体的美女从众多报名的女生中脱颖而出。这些女生将随着篮球队的小伙子们一起,和对手抗衡,为艾利斯顿篮球队加油助威。一个阳光明媚的早晨,雨荨带领拉拉队的队员们开始了排练。\(n\)个女生从左到右排成一行,每个人手中都举了一个写有\(26\)个小写字母中的某一个的牌子,在比赛的时候挥舞,为小伙子们呐喊、加油。雨荨发现,如果连续的一段女生,有奇数个,并且他们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体。现在雨荨想找出所有和谐小群体,并且按照女生的个数降序排序之后,前\(K\)个和谐小群体的女生个数的乘积是多少。由于答案可能很大,雨荨只要你告诉她,答案除以\(19930726\)的余数是多少就行了。
Input
输入为标准输入。第一行为两个正整数\(n\)和\(K\),代表的东西在题目描述中已经叙述。接下来一行为\(n\)个字符,代表从左到右女生拿的牌子上写的字母。
Output
输出为标准输出。输出一个整数,代表题目描述中所写的乘积除以\(19930726\)的余数,如果总的和谐小群体个数小于\(K\),输出一个整数\(-1\)。
Sample Input
5 3
ababa
Sample Output
45
样例说明
和谐小群体女生所拿牌子上写的字母从左到右按照女生个数降序排序后为\(ababa\), \(aba\), \(aba\), \(bab\), \(a\), \(a\), \(a\), \(b\), \(b\),前三个长度的乘积为\(5\times3\times3=45\)。
Hint
总共20个测试点,数据范围满足:
| 测试点 | \(n\) | \(K\) |
|---|---|---|
| 1 | \(\le10\) | \(\le10\) |
| 2 | \(\le100\) | \(\le100\) |
| 3 | \(\le100\) | \(\le100\) |
| 4 | \(\le1,000\) | \(\le1,000\) |
| 5 | \(\le1,000\) | \(\le1,000\) |
| 6 | \(\le1,000\) | \(\le1,000\) |
| 7 | \(\le1,000\) | \(\le1,000\) |
| 8 | \(\le100,000\) | \(=1\) |
| 9 | \(\le100,000\) | \(\le100,000\) |
| 10 | \(\le100,000\) | \(\le100,000\) |
| 11 | \(\le100,000\) | \(\le100,000\) |
| 12 | \(\le100,000\) | \(\le1,000,000,000,000\) |
| 13 | \(\le100,000\) | \(\le1,000,000,000,000\) |
| 14 | \(\le100,000\) | \(\le1,000,000,000,000\) |
| 15 | \(\le500,000\) | \(\le1,000,000,000,000\) |
| 16 | \(\le500,000\) | \(\le1,000,000,000,000\) |
| 17 | \(\le500,000\) | \(\le1,000,000,000,000\) |
| 18 | \(\le1,000,000\) | \(=1\) |
| 19 | \(\le1,000,000\) | \(\le1,000,000\) |
| 20 | \(\le1,000,000\) | \(\le1,000,000,000,000\) |
分析
这道题比较特殊,只要奇数长的回文串,而且需要所有的回文串,而Manacher需要利用之前的结果,因此不方便求出所有回文串,否则就和暴力无本质区别了。
这个时候,我们就需要一个更强大的武器:回文树(回文自动机)。
其实这就是AC自动机+回文串。图中的\(next\)指针即trie中的儿子,只不过是从两边添加。而\(fail\)指针则是AC自动机中的失配指针,可以用于查询。系列操作与AC自动机并无过多差别,具体请见代码。
回文串求出来了,可怎么查询呢?一看\(K\)的大小,就知道不能全部存储。所以以长度为下标存储即可。接着枚举长度,用快速幂计算结果。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=19930726;
ll lenx[1000001],tas;
class PAM{
private:
int nxt[1000001][26],fail[1000001],len[1000001],s[1000001],lst,tot,n;
ll cnt[1000001];
int newn(int lg){
len[tot]=lg;
return tot++;
}
int getf(int u){
while(s[n-len[u]-1]!=s[n])u=fail[u];
return u;
}
public:
void init(){
memset(nxt,0,sizeof(nxt));
lst=tot=n=0;
newn(0);
newn(-1);
s[0]=-1;
fail[0]=1;
}
void add(char c){
s[++n]=c-'a';
int cur=getf(lst);
if(!nxt[cur][c-'a']){
int u=newn(len[cur]+2);
fail[u]=nxt[getf(fail[cur])][c-'a'];
nxt[cur][c-'a']=u;
}
lst=nxt[cur][c-'a'];
cnt[lst]++;
}
void cont(){
for(int i=tot-1;i>=0;i--)cnt[fail[i]]+=cnt[i];
for(int i=2;i<tot;i++){
if(len[i]&1){
lenx[len[i]]+=cnt[i];
tas+=cnt[i];
}
}
}
}pam;
ll fastpow(ll x,ll p){
ll ans=1;
while(p){
if(p&1)ans=ans*x%mod;
x=x*x%mod;
p>>=1;
}
return ans;
}
char str[1000001];
int main(){
ll n,k,ans=1;
scanf("%lld%lld",&n,&k);
scanf("%s",str);
pam.init();
for(int i=0;i<n;i++)pam.add(str[i]);
pam.cont();
if(k>tas){printf("-1\n");return 0;}
for(int i=n;i>=1&&k;i--){
ans=ans*fastpow(i,min(lenx[i],k))%mod;
k=max(k-lenx[i],0LL);
}
printf("%lld\n",ans);
}
[回文树][BZOJ2160][国家集训队]拉拉队排练的更多相关文章
- luogu P1659 [国家集训队]拉拉队排练
唔....话说好久没有发布题解了(手痒痒了 首先特别鸣谢lykkk大佬今天下午教我Manacher算法,甚是感谢 为了体现学习成果,写一篇蒟蒻版的题解(大佬勿喷 言归正传 题面——>在这儿 首先 ...
- Manacher【p1659】 [国家集训队]拉拉队排练
题目描述 n个女生举牌子(只含有26个小写字母,长度为n的字符串), 如果连续的一段女生,有奇数个,并且她们手中的牌子所写的字母,从左到右和从右到左读起来一样,那么这一段女生就被称作和谐小群体. 现在 ...
- [国家集训队] 拉拉队排练 - Manacher
用 Manacher 跑出回文串长,注意这里不需要偶数长度所以不需要对串做一些奇怪的处理 然后用前缀和搞一下,计算答案时跑快速幂即可 #include <bits/stdc++.h> us ...
- 洛谷 P1659 [国家集训队]拉拉队排练(Manacher)
题目链接:https://www.luogu.com.cn/problem/P1659 思路: 首先跑一遍Manacher,用$cnt_i$记录长为$i$的回文串有多少个. 所记录的$cnt$并不是最 ...
- 题解 P1659 【[国家集训队]拉拉队排练】
一眼可得PAM 如果没学过PAM的可以看这里:PAM学习小结 我们令PAM上多记录一个信息\(sum\),表示该节点表示串在原串上出现了多少次. 当我们处理完了\(sum\),对于长度\(len\)为 ...
- P1659 [国家集训队]拉拉队排练
思路 求出cnt和len之后,直接乘起来即可 代码 #include <cstdio> #include <algorithm> #include <cstring> ...
- [国家集训队]拉拉队排练 Manancher_前缀和_快速幂
Code: #include <cstdio> #include <algorithm> #include <cstring> using namespace st ...
- 【洛谷 P1659】 [国家集训队]拉拉队排练(manacher)
题目链接 马拉车+简单膜你 #include <cstdio> #include <cstring> #include <algorithm> using name ...
- 【BZOJ2160】拉拉队排练(回文树)
[BZOJ2160]拉拉队排练(回文树) 题面 BZOJ 题解 看着题目, 直接构建回文树 求出每个回文串的出现次数 直接按照长度\(sort\)一下就行了 然后快速幂算一下答案就出来了 这题貌似可以 ...
随机推荐
- 织梦上传webp格式图片
织梦cms如何添加其他格式的图片呢? 这里以webp为类来实现一下如何让织梦支持webp 1.修改系统设置让织梦(dede)支持该图片格式,比如:webp(新图片格式) 系统->系统基本参数-& ...
- Java中mouseDragged有效mouseMoved没响应的可能原因
1.这个问题在jdk7与jdk8上都会出现. 2.具体表现为: 单独写个测试例子,用JFrame实现了mouseMoved接口,mouseDragged和mouseMoved都输出方法名和坐标,结果是 ...
- dedecms网站扩展手机网站—共用数据库真正做到电脑手机同步访问,原pc站无需改动,对原pc站无任何影响
在如今无线互联网大潮的冲击下,越来越多的pc网站访问量下降,首当其冲的就是以pc网站为生的站长们,为了顺应无线互联网的要求,站长们很有必要为自己的pc网站扩展一套手机网站,更早的抓住手机用户的流量,使 ...
- Eclipse: 导入项目乱码问题解决
1.编码不对 a.对某文件或某工程更改编码: 鼠标移到工程名或文件名,右键->Properties->Resource->Text file enCoding ->更改编码(G ...
- 使用fn_dblog函数查看事务日志和恢复数据
基本语法 SqlServer中有一个未在文档中公开的函数sys.fn_dblog,提供查询当前数据库事务日志的功能.通过这个函数,可以简单了解下数据库事务日志的机制 使用方法如下: select * ...
- 怎样学习webpack - 走心分享
很多朋友可能都知道webpack,也见过webpack的代码,但是不明白里面一坨一坨的东西是什么意思,到底有什么用处!我们每个人学习一个新东西可能都会有这个过程,但是我个人觉得webpack可能是最混 ...
- PHP 简单调用rest WebServices
<?php $ch = curl_init("http://api.cachk.com:8185/Tech-Trans.esPOS4.PosService.UAT/rest/enqui ...
- react+webpack 引入字体图标
在使用react+webpack 构建项目过程中免不了要用到字体图标,在引入过程中报错,不能识别字体图标文件中的@符,报错 Uncaught Error: Module parse failed: U ...
- Poj(2225),三维BFS
题目链接:http://poj.org/problem?id=2225 这里要注意的是,输入的是坐标x,y,z,那么这个点就是在y行,x列,z层上. 我竟然WA在了结束搜索上了,写成了输出s.step ...
- Edmonds-Karp算法,最大流POJ(1459)
题目链接:http://poj.org/problem?id=1459 解题报告: 电力调度站不涉及流的产生和消耗,不用考虑,Edmonds-Karp算法,就是利用剩余网络和增广路来解决,网络中的最大 ...