[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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章