[eertree] Codeforces 932G. Palindrome Partition

http://codeforces.com/blog/entry/19193

不是很懂证明

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N=1000010,P=1e9+7;

int n,t,cnt,p;
char a[N];
int b[N],f[N],g[N];

int len[N],fail[N],dfail[N],diff[N],nxt[N][26];

inline void extend(int x){
  while(b[x]!=b[x-len[p]-1]) p=fail[p];
  if(!nxt[p][b[x]]){
    int cur=++cnt,k=fail[p]; len[cur]=len[p]+2;
    while(b[x]!=b[x-len[k]-1]) k=fail[k];
    fail[cur]=nxt[k][b[x]];
    nxt[p][b[x]]=cur;
    diff[cur]=len[cur]-len[fail[cur]];
    if(diff[cur]==diff[fail[cur]])
      dfail[cur]=dfail[fail[cur]];
    else
      dfail[cur]=fail[cur];
  }
  p=nxt[p][b[x]];
}

int pos[N];

int main(){
  scanf("%s",a+1); n=strlen(a+1);
  if(n&1) return puts("0"),0;
  int l=n>>1,r=l+1; b[0]=-1;
  for(int i=1;i<=(n>>1);i++)
    b[++t]=a[l--]-'a',b[++t]=a[r++]-'a';
  cnt=1; fail[0]=fail[1]=1; diff[0]=1; len[1]=-1; f[0]=1;
  for(int i=1;i<=n;i++){
    extend(i);
    for(int np=p;np;np=dfail[np]){
      g[np]=f[i-(len[dfail[np]]+diff[np])];
      if(diff[np]==diff[fail[np]])
    g[np]=(g[np]+g[fail[np]])%P;
      f[i]=(f[i]+g[np])%P;
    }
    if(i&1) f[i]=0;
  }
  printf("%d\n",f[n]);
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值