复习了一下高斯消元解图上期望概率,笔记的话,就直接去看SengXian的blog吧.
BZOJ 1444 - [Jsoi2009]有趣的游戏
见https://blog.sengxian.com/solutions/bzoj-1444
#include <cstdio> #include <cstring> #include <algorithm> const int N=11; char s[N*2]; int n,m,l,cnt,trans[N*N][N],id[N*N],fail[N*N],pos[N],queue[N*N],front,back; double a[N*N][N*N],temp[N*N][N*N],pro[N]; inline void insert(int x){ int i,p=0; for(i=1;i<=l;++i){ if(!trans[p][s[i]-'A'])trans[p][s[i]-'A']=++cnt; p=trans[p][s[i]-'A']; } id[p]=x,pos[x]=p; } inline void Build(){ front=back=0; queue[back++]=0; int x,i; while(front!=back){ x=queue[front++]; for(i=0;i<m;++i) if(trans[x][i]){ queue[back++]=trans[x][i]; fail[trans[x][i]]=x?trans[fail[x]][i]:0; }else trans[x][i]=x?trans[fail[x]][i]:0; } } inline void PF(){ register int i,j,k; for(i=0;i<=cnt;++i) for(j=0;j<=cnt;++j) temp[i][j]=0; for(i=0;i<=cnt;++i) for(j=0;j<=cnt;++j) for(k=0;k<=cnt;++k) temp[i][j]+=a[i][k]*a[k][j]; for(i=0;i<=cnt;++i) for(j=0;j<=cnt;++j) a[i][j]=temp[i][j]; } int main(){ //freopen("rio.txt","r",stdin); scanf("%d%d%d",&n,&l,&m); int i,j,x,y; for(i=0;i<m;++i){ scanf("%d%d",&x,&y); pro[i]=(double)x/y; } for(i=1;i<=n;++i){ scanf("%s",s+1); insert(i); } Build(); for(i=0;i<=cnt;++i) if(!id[i]) for(j=0;j<m;++j) a[trans[i][j]][i]+=pro[j]; else a[i][i]=1; int T=50; while(T--)PF(); for(i=1;i<=n;++i) printf("%.2f\n",a[pos[i]][0]); return 0; }