BZOJ 2160: 拉拉队排练(回文树)
传送门:
[1]:BZOJ
[2]:洛谷
•题意
求串 s 中出现的所有奇回文串,并按照长度由大到小排序;
输出前 k 个奇回文串的乘积 mod 19930726;
如果奇回文串的个数不足 k 个,输出 -1;
•题解
将串 s 跑一边回文自动机;
将求解出的 len,cnt 数组存入一个结构体中并按照 len 由大到小排序;
将前 k 个奇回文串的长度相乘就行;
记得用快速幂,并且只要奇回文串的长度乘积;
•Code
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- const int MOD=;
- const int maxn=1e6+;
- int n;
- ll k;
- char s[maxn];
- struct PAM
- {
- int tot;
- int last;
- ll cnt[maxn];
- ll len[maxn];
- int fail[maxn];
- int son[maxn][];
- int newNode(int Len)
- {
- for(int i=;i < ;++i)
- son[tot][i]=;
- len[tot]=Len;
- fail[tot]=;
- cnt[tot]=;
- return tot++;
- }
- int getFail(int p,int i)
- {
- while(s[i-len[p]-] != s[i])
- p=fail[p];
- return p;
- }
- void Init()
- {
- tot=;
- last=;
- newNode();
- newNode(-);
- fail[]=;
- }
- void Count()
- {
- for(int i=tot-;i >= ;--i)
- cnt[fail[i]] += cnt[i];
- }
- void pam()
- {
- Init();
- for(int i=;i <= n;++i)
- {
- s[i]=s[i]-'a'+;
- int cur=getFail(last,i);
- if(!son[cur][s[i]])
- {
- int now=newNode(len[cur]+);
- fail[now]=son[getFail(fail[cur],i)][s[i]];
- son[cur][s[i]]=now;
- }
- cnt[last=son[cur][s[i]]]++;
- }
- Count();
- }
- }_pam;
- struct Data
- {
- ll cnt;
- ll len;
- bool operator < (const Data &obj) const
- {
- return len > obj.len;
- }
- }a[maxn];
- ll qPow(ll a,ll b,ll m)
- {
- ll ans=;
- a %= m;
- while(b)
- {
- if(b&)
- ans=ans*a%m;
- a=a*a%m;
- b >>= ;
- }
- return ans;
- }
- int main()
- {
- scanf("%d%lld",&n,&k);
- scanf("%s",s+);
- s[]='#';
- _pam.pam();
- int x=;
- for(int i=;i < _pam.tot;i++)
- a[++x]=Data{_pam.cnt[i],_pam.len[i]};
- sort(a+,a+x+);
- int index=;
- ll ans=;
- while(index <= x)
- {
- if(!(a[index].len&))///坑:如果不是奇回文串,continue
- {
- index++;
- continue;
- }
- ll cur=min(k,a[index].cnt);
- ans *= qPow(a[index++].len,cur,MOD);
- ans %= MOD;
- k -= cur;
- if(k == )
- break;
- }
- if(k > )
- ans=-;
- printf("%lld\n",ans);
- }
BZOJ 2160: 拉拉队排练(回文树)的更多相关文章
- bzoj 2160: 拉拉队排练 回文自动机
题目: Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助 ...
- BZOJ2160拉拉队排练——回文自动机
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...
- BZOJ 2160: 拉拉队排练
Description 问长度前 \(k\) 大的奇长度回文子串的乘积. Sol Manacher. 直接马拉车跑一边,统计一下答案,每次将长度-2就可以了. Code /************** ...
- BZOJ.2160.拉拉队排练(Manacher)
题目链接 \(Description\) 求给定字符串中 最长的k个回文串长度的乘积(要求回文串长度为奇数):若奇数长度回文串不足k个则输出-1.(len<=10^6,k<=10^12) ...
- 【BZOJ2342】双倍回文(回文树)
[BZOJ2342]双倍回文(回文树) 题面 BZOJ 题解 构建出回文树之后 在\(fail\)树上进行\(dp\) 如果一个点代表的回文串长度为\(4\)的倍数 并且存在长度为它的一半的回文后缀 ...
- HYSBZ 2160 拉拉队排练(回文树)
2160: 拉拉队排练 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 825 Solved: 324 [Submit][Status][Discu ...
- 【BZOJ2160】拉拉队排练(回文树)
[BZOJ2160]拉拉队排练(回文树) 题面 BZOJ 题解 看着题目, 直接构建回文树 求出每个回文串的出现次数 直接按照长度\(sort\)一下就行了 然后快速幂算一下答案就出来了 这题貌似可以 ...
- [回文树][BZOJ2160][国家集训队]拉拉队排练
题面 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮 ...
- 【BZOJ】2160: 拉拉队排练(Manacher)
题目 2160: 拉拉队排练 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长 ...
随机推荐
- mysql5.7以上版本安装
首先下载mysql5.7zip版本 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 然后放在本地解压 下载5.6版本 https:// ...
- oracle-Dbca数据库模板
数据库模板是用xml文件格式保存在本地磁盘上的数据库配置的定义. Dbca能够使用两种类型的模板:种子模板和非种子模板. 种子模板指含有定义信息和实际的数据文件与重做日志文件的模板定义. 种子模板的优 ...
- 2019-1-29-jekyll-如何加密博客-防止抓取
title author date CreateTime categories jekyll 如何加密博客 防止抓取 lindexi 2019-01-29 16:26:17 +0800 2018-2- ...
- 序列化类型为“System.Data.Entity.DynamicProxies..."对象时检测到循环引用
这是因为EF外键引起的序列化问题. 解决方案: context.Configuration.ProxyCreationEnabled = false; 这里我用的是一个基类控制器用于被继承 返回EF实 ...
- 2017校赛 C: 不爱学习的小W【模拟】
题目描述 “叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有n行m列的座位而且刚好坐满.既然是上课,那老师叫学生回答问题就是再正常不过的事了,同样地,教室里也就有爱学习和不爱学习的学生了,爱 ...
- ORA-03113: end-of-file on communication channel 解决方案
Oracle启动时报如下错误:ORA-03113: end-of-file on communication channel 解决方案如下:1.查看orcle启动日志,确定具体是什么原因引起的错误. ...
- 关于Apple Watch,听听开发了两个月Watch App的工程师怎么说
今年1月份有幸应苹果邀请,秘密参与苹果 Watch App 的真机现场调试.4月份,Apple Watch 会正式上市.在这之前,也算是亲自抢先体验了 Apple Watch,以及开发了一下 Watc ...
- selenium 图片上传
WebElement file = driver.findElement(By.name("filename")); 给此元素设置值:file.sendKeys("E: ...
- SDUT-3342_数据结构实验之二叉树三:统计叶子数
数据结构实验之二叉树三:统计叶子数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉树的一个按先序遍历输入的字符 ...
- Redis源码解析:08对象
前面介绍了Redis用到的所有主要数据结构,比如简单动态字符串(SDS).双端链表.字典.压缩列表.整数集合等.然而Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一 ...