bzoj千题计划302:bzoj3160: 万径人踪灭
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: 万径人踪灭的更多相关文章
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
- bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...
- bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹
http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...
- bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机
http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...
- bzoj千题计划250:bzoj3670: [Noi2014]动物园
http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...
随机推荐
- Kitematic - VirtualBox is not installed. Docker for windows 10
Kitematic - VirtualBox is not installed. Docker for windows 10 https://github.com/docker/kitematic/i ...
- 虚拟机使用不同CPU配置时内存性能的差异
第一款机器的配置: CPU(s): 8On-line CPU(s) list: 0-7Thread(s) per core: 1Core(s) per socket: 4座: 2NUMA 节点: 1 ...
- scipy积分 integral
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/24 15:03 # @Author : zhang chao # @Fi ...
- 如何禁止复制电脑文件到U盘、禁止U盘拷贝文件
在公司局域网中,有时候我们处于保护电脑文件安全和商业机密的需要,会禁止局域网电脑使用U盘.禁用USB存储设备:或者禁止通过U盘复制电脑文件.禁止U盘拷贝公司电脑文件.那么,怎样实现呢?本文提供两种方法 ...
- selenium之调用Javascript
selenium调用Javascript使用方法: driver.execute_script(js) 使用JS获取元素文本值,代码片段如下: ...... js = "return $(' ...
- LOJ115 无源汇有上下界可行流(上下界网络流)
假设初始流为每条边的下界.但这样可能流量会不守恒,我们需要在上面加上一个附加流使流量守恒.只要让每个点开始的出/入流量与原初始流相等就可以求出附加流了.那么新建超源S超汇T,令degree[i]表示流 ...
- ubuntu eclipse 无法打开
报错: The catalog could not be loaded... 这个问题,我上网查了很久.. 基本上网上可用的办法我都试过了.全是失败的 firefox+autoproxy,shadow ...
- Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) A,B,C
A.题目链接:http://codeforces.com/contest/828/problem/A 解题思路: 直接暴力模拟 #include<bits/stdc++.h> using ...
- android progressdialog 对话框试用实例
ProgressDialog 跟AlertDialog用法差不多,不同的是:ProgressDialog 显示的是一种"加载中"的效果,android 中 ProgressDial ...
- [luogu4551][POJ3764]最长异或路径
题目描述 给定一棵n个点的带权树,结点下标从1开始到N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指两个结点之间唯一路径上的所有边权的异或. 分析 处理出各个节点到根节点的异或距离,然后我 ...