题解 CF932G【Palindrome Partition】
题意
给出字符串 ,求 的划分满足 且 ,对 取模。
.
思路
回文划分的模板题,我觉得 的题解写得很好,我就简述一下吧。
我们知道,字符串的 集合可以划分为 个等差数列。
考虑一个回文串的回文后缀:
设 ,若 ,则 。
证:
因为 ,所以 ;
因为 ,所以;
所以 。
即得到回文串的回文后缀集合可以划分为 个等差数列。
在 上,记 , 表示 树上 点祖先中离 最近的满足 的 。
容易发现,在 的路径中, 恒为定值,即在跳一条等差数列,由上面的结论得, 最多能跳 次就会达到根节点。
首先考虑给出字符串 ,求 的划分数满足 应该怎么做。
我们考虑一个 ,设 表示 前缀的答案,则有一个显然的转移方程:
如果枚举 只能做到 的时间复杂度。
由于回文串的回文后缀又是 ,所以等差数列中的后缀都平移了公差 。
那么 就成为了 ,于是我们可以记录 表示 中链上回文子串最后一次出现对应的 值,我们可以简单地将 转移至 ,于是在加入节点时我们就可以跳 ,更新 即可。
然后回到本题,我们可以考虑构造 ,问题转化为对 的偶回文子串划分。
那么只在 时做出贡献即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
namespace IO{//by cyffff
}
const int N=1e6+10,mod=1e9+7;
int n;
int dp[N],f[N];
char str[N],inp[N];
struct Palindromic_Tree{
struct node{
int ch[26];
int fail,len,diff,slink;
}a[N];
int last,siz;
inline void init(){
siz=1,last=0;
a[0].fail=1,a[1].fail=0;
a[0].len=0,a[1].len=-1;
}
inline int getfail(int p,int x){
while(str[x]!=str[x-a[p].len-1])
p=a[p].fail;
return p;
}
inline void insert(char ch,int x){
int p=getfail(last,x);
int w=ch-'a';
if(!a[p].ch[w]){
int cur=++siz;
a[cur].len=a[p].len+2;
int tmp=getfail(a[p].fail,x);
a[cur].fail=a[tmp].ch[w];
a[p].ch[w]=cur;
a[cur].diff=a[cur].len-a[a[cur].fail].len;
a[cur].slink=(a[cur].diff==a[a[cur].fail].diff)?a[a[cur].fail].slink:a[cur].fail;
}
last=a[p].ch[w];
}
inline void calc(){
init();
n=readstr(inp);
if(n&1){
write(0);
return ;
}
for(int i=1;i<=n;i+=2) str[i]=inp[i+1>>1];
reverse(inp+1,inp+n+1);
for(int i=2;i<=n;i+=2) str[i]=inp[i+1>>1];
dp[0]=1;
str[0]='\n';
for(int i=1;i<=n;i++){
insert(str[i],i);
for(int j=last;j;j=a[j].slink){
f[j]=dp[i-a[a[j].slink].len-a[j].diff];
if(a[j].slink!=a[j].fail){
f[j]=(f[j]+f[a[j].fail])%mod;
}
if(i%2==0)
dp[i]=(dp[i]+f[j])%mod;
}
}
write(dp[n]);
}
}PAM;
int main(){
PAM.calc();
flush();
return 0;
}
居然跑到了洛谷 rk1
再见 qwq~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现