复习了一下高斯消元解图上期望概率,笔记的话,就直接去看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;
}
大力迭代

相关文章:

  • 2022-12-23
  • 2021-04-23
  • 2022-01-30
  • 2021-09-04
  • 2021-12-06
  • 2021-07-28
  • 2021-11-16
  • 2022-02-06
猜你喜欢
  • 2021-09-20
  • 2021-11-22
  • 2022-02-18
  • 2021-11-23
  • 2022-01-30
  • 2021-09-14
  • 2021-08-01
相关资源
相似解决方案