https://www.lydsy.com/JudgeOnline/problem.php?id=3160

不连续的回文串数量=所有的回文序列数量-连续的回文子串

连续的回文子串:

manacher 得到的以i为中心的连续回文串数量=以i为中心的最长回文半径长度

所有的回文序列:

将a看做1,b看做0,自己跟自己做一遍fft

得到的a[i]就是以i/2为中心的由a构成的最长回文序列长度

将a看做0,b看做1,自己跟自己做一遍fft

得到的b[i]就是以i/2为中心的由b构成的最长回文序列长度

因为可以不连续,所以每一对以i为中心的对称位置要么同时选,要么同时不选

所以以i为中心的回文序列数量=2^(f[i]/2  [上取整])-1

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; const int N=(<<)+; const double pi=acos(-); const int mod=1e9+; char s[N];
int n; struct Complex
{
double x,y;
Complex(double x_=,double y_=):x(x_),y(y_){}
Complex operator + (Complex P)
{
return Complex(x+P.x,y+P.y);
}
Complex operator - (Complex P)
{
return Complex(x-P.x,y-P.y);
}
Complex operator * (Complex P)
{
return Complex(x*P.x-y*P.y,x*P.y+y*P.x);
}
};
typedef Complex E; E a[N],b[N];
int rev[N];
int f[N]; char t[N];
int p[N]; int Pow(int a,int b)
{
int res=;
for(;b;b>>=,a=1LL*a*a%mod)
if(b&) res=1LL*res*a%mod;
return res;
} void fft(E *a,int len,int tag)
{
for(int i=;i<len;++i)
if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int i=;i<len;i<<=)
{
E wn(cos(pi/i),tag*sin(pi/i));
for(int p=i<<,j=;j<len;j+=p)
{
E w(,);
for(int k=;k<i;++k,w=w*wn)
{
E x=a[j+k],y=a[j+k+i]*w;
a[j+k]=x+y; a[j+k+i]=x-y;
}
}
}
if(tag==-)
{
for(int i=;i<len;++i) a[i].x=(a[i].x+0.5)/len;
}
} int solve_all()
{
for(int i=;i<n;++i)
if(s[i]=='a') a[i].x+=; else b[i].x=;
int num=n*-,len=,bit=;
while(len<num) len<<=,bit++;
for(int i=;i<len;++i) rev[i]=(rev[i>>]>>)|((i&)<<bit-);
fft(a,len,);
for(int i=;i<len;++i) a[i]=a[i]*a[i];
fft(a,len,-);
fft(b,len,);
for(int i=;i<len;++i) b[i]=b[i]*b[i];
fft(b,len,-);
for(int i=;i<len;++i) f[i]=a[i].x+b[i].x;
int sum=;
for(int i=;i<len;++i)
{
sum+=Pow(,f[i]+>>)-;
sum-=sum>=mod ? mod : ;
}
return sum;
} void manacher(int m)
{
int id=,pos=,x=;
for(int i=;i<=m;++i)
{
if(pos>i) x=min(p[id*-i],pos-i);
else x=;
while(t[i-x]==t[i+x]) x++;
if(i+x>pos) pos=i+x,id=i;
p[i]=x;
}
} int solve_continuous()
{
int m=;
t[m]='!';
for(int i=;i<n;++i)
{
t[++m]='#';
t[++m]=s[i];
}
t[++m]='#';
t[m+]='@';
manacher(m);
int sum=;
for(int i=;i<=m;++i)
{
sum+=p[i]>>;
sum-=sum>=mod ? mod : ;
}
return sum;
} int main()
{
scanf("%s",s);
n=strlen(s);
int t1=solve_all();
int t2=solve_continuous();
printf("%d",(t1-t2+mod)%mod);
}

bzoj千题计划302:bzoj3160: 万径人踪灭的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. Docker查看容器IP

    https://segmentfault.com/q/1010000001637726 https://blog.csdn.net/sannerlittle/article/details/77063 ...

  2. Java 修饰符顺序问题

    What is a reasonable order of Java modifiers (abstract, final, public, static, etc.)? http://stackov ...

  3. [转帖]关于hostnamectl 命令

    作者:Linux运维 来源:CSDN 原文:https://blog.csdn.net/linuxnews/article/details/51112022 版权声明:本文为博主原创文章,转载请附上博 ...

  4. ionic2添加 android平台出现的问题

    nodejs版本不宜过高  cordova版本不宜过高 此情况应采取 cordova platform add android --nofetch

  5. Linux基础学习(9)--文件系统管理

    第九章——文件系统管理 一.回顾分区和文件系统 1.分区类型: 2.分区表示方法: 3.文件系统: 二.文件系统常用命令 1.df命令.du命令.fsck命令和dump2fs命令: (1)文件系统查看 ...

  6. idea for mac 最全快捷键整理

    一.Mac键盘符号和修饰键说明 ⌘ Command ⇧Shift ⌥ Option ⌃ Control ↩︎ Return/Enter ⌫ Delete ⌦ 向前删除键(Fn+Delete) ↑ 上箭 ...

  7. rabbitmq使用报错总结

    最近公司重构服务器架构,需要用到rabbitmq,在公司搞了一个下午还是连接不上,后来细看了英文说明,测试连接成功,得出如下报错几点. 我用的安装包:otp_win64_21.3.exe(erlang ...

  8. Ubuntu 16.04安装Maven

    此篇为http://www.cnblogs.com/EasonJim/p/7139275.html的分支页. 前提:必须正确安装JDK. 一.通过二进制包(tar.gz)安装 下载: 进入下载列表:h ...

  9. jenkins--svn+添加钩子去触发jenkins的job工作

    找到svn钩子脚本 post-commit: 添加一个接口: /usr/bin/curl http://admin:admin@x.x.x.x:8080/job/svn/buildWithParame ...

  10. 最大获利 HYSBZ - 1497 (最大权闭合图)

    最大权闭合图: 有向图,每个点有点权,点权可正可负.对于任意一条有向边i和j,选择了点i就必须选择点j,你需要选择一些点使得得到权值最大. 解决方法: 网络流 对于任意点i,如果i权值为正,s向i连容 ...