1. 程式人生 > >BZOJ2553 Beijing2011禁忌(AC自動機+動態規劃+矩陣快速冪+概率期望)

BZOJ2553 Beijing2011禁忌(AC自動機+動態規劃+矩陣快速冪+概率期望)

() get lld pac code operator bsp open 自動機

  考慮對一個串如何分割能取得最大值。那麽這是一個經典的線段覆蓋問題,顯然每次取右端點盡量靠前的串。於是可以把串放在AC自動機上跑,找到一個合法串後就記錄並跳到根。

  然後考慮dp。設f[i][j]表示前i位走到AC自動機上j節點的概率,枚舉下個字符即可轉移。同時記錄此時期望傷害,找到合法串就統計入答案。

  並且註意到每次轉移是相同的。矩陣快速冪優化即可。

  以及非常卡精度,需要全程long double。cout的保留小數位數誤差是相當大的,必須用printf。並且轉移到某個字符的概率即1/alphabet需要強制轉換成long double,否則也會丟失精度。

#include<iostream> 
#include
<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<0||c>9) {if (c==-) f=-1;c=getchar();} while (c>=0&&c<=9) x=(x<<1)+(x<<3
)+(c^48),c=getchar(); return x*f; } #define N 80 #define double long double int n,m,S,trie[N][26],fail[N],val[N],q[N],cnt=0; char c[20]; struct matrix { int n;double a[N][N]; matrix operator *(const matrix&b) const { matrix c;c.n=n;memset(c.a,0,sizeof(c.a)); for (int i=0
;i<n;i++) for (int j=0;j<N;j++) for (int k=0;k<N;k++) c.a[i][j]+=a[i][k]*b.a[k][j]; return c; } }f,a; void ins(char *a) { int n=strlen(a+1),t=0; for (int i=1;i<=n;i++) { if (!trie[t][a[i]-a]) trie[t][a[i]-a]=++cnt; t=trie[t][a[i]-a]; } val[t]=1; } void build() { int head=0,tail=0;for (int i=0;i<S;i++) if (trie[0][i]) q[++tail]=trie[0][i]; do { int x=q[++head]; for (int i=0;i<S;i++) if (trie[x][i]) q[++tail]=trie[x][i],fail[trie[x][i]]=trie[fail[x]][i],val[trie[x][i]]|=val[fail[trie[x][i]]]; else trie[x][i]=trie[fail[x]][i]; }while (head<tail); } int main() { #ifndef ONLINE_JUDGE freopen("bzoj2553.in","r",stdin); freopen("bzoj2553.out","w",stdout); const char LL[]="%I64d\n"; #else const char LL[]="%lld\n"; #endif n=read(),m=read(),S=read(); for (int i=1;i<=n;i++) scanf("%s",c+1),ins(c); build(); a.n=cnt+2; for (int i=0;i<=cnt;i++) for (int j=0;j<S;j++) if (val[trie[i][j]]) a.a[i][0]+=(double)1/S,a.a[i][cnt+1]+=(double)1/S; else a.a[i][trie[i][j]]+=(double)1/S; a.a[cnt+1][cnt+1]=1; f.n=1;f.a[0][0]=1; for (;m;a=a*a,m>>=1) if (m&1) f=f*a; printf("%.8Lf",f.a[0][cnt+1]); return 0; }

BZOJ2553 Beijing2011禁忌(AC自動機+動態規劃+矩陣快速冪+概率期望)