mcfx's blog - FFT
/category/FFT/
-
BZOJ 3160: 万径人踪灭
/archives/175/
2017-01-20T22:21:00+08:00
###Description
略。见[BZOJ3160][1]
###Solution
对于“不能是连续的一段”,可以先计算所有答案,然后减去连续一段的,即回文串,这个用回文自动机或者manacher可以得出
考虑以每个位置为中心的对称元素对个数f[i],那么i位置对答案的贡献是$$2^{f[i]}-1$$
如果把a视为1,b视为-1,然后把原串长度\*4,卷积,那么以i为中心的元素对如果相同,则贡献1,否则贡献-1
###Code
```c++
#include
typedef double lf;
#define fo0(i,n) for(int i=0,i##end=n;i>1|(i&1)nxt[u];
}
cur=tmp;
}
}
}
inline void count()
{
for(node *x=tm-1;x>=t;x--)
if(x->fail)x->fail->cnt+=x->cnt;
}
#define P 1000000007
inline int cnt()
{
int ans=0;
for(node *x=tm-1;x>t+1;x--)
ans=mod(ans+x->cnt,P);
return ans;
}
char s[100000];
num p[N];
int po[100001];
int main()
{
scanf("%s",s);
int n=strlen(s);
fo1(i,n/2+5)po[i]=mod(mod(po[i-1]*2+1,P),P);
int y=0;
while((1