BZOJ 2160: 拉拉队排练(回文树)
2024-09-06 14:17:12
传送门:
[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);
}
最新文章
- mount --bind 重启后失效的解决办法
- iOS应用架构谈(二):View层的组织和调用方案(上)
- PHP学习(四)---PHP与数据库MySql
- jsp数据库连接出现乱码
- 自学php找工作【二】 PHP计算时间加一天
- SQL Server 事务处理 回滚事务
- poj 3468 A Simple Problem with Integers (线段树 成段更新 加值 求和)
- 要注意null合并运算符的优先级比+还要低
- JDK5-自动拆装箱
- C++学习笔记2——引用
- SMTP 553
- HTML+CSS - 搜索 And 高级搜索
- Python 字典和集合
- kafka单机安装和启动
- wxPython树控件
- Go语言strings和strconv包
- css 样式控制文本过长实现省略号
- java 基础类库之 SysFun
- 查看锁信息(开启InnoDB监控)
- 新版剑指offer14 剪绳子
热门文章
- python 基本数据结构 ndarray
- PHP小知识总结(1)
- 删除指定节点Remove Nth Node From End of List
- Hdu 2522 hash
- LeetCode172 Factorial Trailing Zeroes. LeetCode258 Add Digits. LeetCode268 Missing Number
- Python学习之路1☞简介及入门代码
- C/S和B/S交互 2016-03-19 11:27 1275人阅读 评论(30) 收藏
- Vue CLI图形化创建项目
- 【NS2】cygwin+NS2.29安装之道 (转载)
- LeetCode120 Triangle