HDU 5955 AC自动机+高斯消元
2017-10-08 15:00
323 查看
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<cmath> #include<queue> using namespace std; const int SIGMA_SIZE=6; const int MAXNODE=100+20; const int maxn=12; int idx[10]; void init() { for(int i=0;i<6;i++){ idx[i+1]=i; } } void Gauss(double A[MAXNODE][MAXNODE],int n) { int i,j,k,r; for(i=0;i<n;i++){ r=i; for(j=i+1;j<n;j++) if(fabs(A[j][i])>fabs(A[r][i])) r=j; if(r!=i) for(j=0;j<=n;j++) swap(A[r][j],A[i][j]); for(k=i+1;k<n;k++){ double f=A[k][i]/A[i][i]; for(j=i;j<=n;j++) A[k][j]-=f*A[i][j]; } } for(i=n-1;i>=0;i--){ for(j=i+1;j<n;j++){ A[i] -=A[j] *A[i][j]; } A[i] /=A[i][i]; } } struct ACAutomata{ int ch[MAXNODE][SIGMA_SIZE]; int f[MAXNODE]; int val[MAXNODE]; int last[MAXNODE]; int sz; double A[MAXNODE][MAXNODE]; bool vis[MAXNODE]; void init() { memset(ch[0],0,sizeof(ch[0])); sz=1; } void insert(int s[],int n,int v) { int u=0; for(int i=0;i<n;i++){ int c=idx[s[i]]; if(!ch[u][c]){ memset(ch[sz],0,sizeof(ch[sz])); val[sz]=0; ch[u][c]=sz++; } u=ch[u][c]; } val[u]=v; } void getFail() { queue<int> que; int u=0; f[0]=0; for(int c=0;c<SIGMA_SIZE;c++){ u=ch[0][c]; if(u){ f[u]=0;last[u]=0; que.push(u); } } while(!que.empty()){ int r=que.front();que.pop(); for(int c=0;c<SIGMA_SIZE;c++){ u=ch[r][c]; if(!u){ ch[r][c]=ch[f[r]][c]; continue; } que.push(u); int v=f[r]; while(v&&!ch[v][c]){ v=f[v]; } f[u]=ch[v][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; if(!val[u]){ val[u]=val[f[u]]?1:0; } } } } double GetMatrix(int pos,int N) { memset(A,0,sizeof(A)); for(int u=0;u<sz;u++){ if(val[u]){ if(val[u]==pos){ A[u][sz]=1.0; A[u][u]=1.0; } else{ A[u][u]=1.0; A[u][sz]=0.0; } continue; } else{ A[u][u]=6.0; for(int i=0;i<SIGMA_SIZE;i++){ // printf("%d %d\n",u,ch[u][i]); A[u][ch[u][i]]-=1.0; } } } // for(int i=0;i<sz;i++){ // for(int j=0;j<=sz;j++){ // printf("%0.2lf ",A[i][j]); // } // printf("\n"); // } Gauss(A,sz); // for(int i=0;i<sz;i++){ // for(int j=0;j<=sz;j++){ // printf("%0.2lf ",A[i][j]); // } // printf("\n"); // } return A[0][sz]; } }; ACAutomata ac; int str[maxn][maxn]; int T,N; int len; void solve(); int main() { init(); scanf("%d",&T); while(T--){ solve(); } return 0; } void solve() { ac.init(); scanf("%d %d",&N,&len); for(int i=1;i<=N;i++){ for(int j=0;j<len;j++){ scanf("%d",&str[i][j]); } ac.insert(str[i],len,i); } ac.getFail(); for(int i=1;i<=N;i++){ double ans=ac.GetMatrix(i,N); if(i!=1) printf(" "); printf("%0.6lf",ans); } printf("\n"); }
相关文章推荐
- hdu 5955 (ac自动机+高斯消元 )
- hdu 3992 AC自动机上的高斯消元求期望
- 【BZOJ4820】[Sdoi2017]硬币游戏 AC自动机+概率DP+高斯消元
- HDU - 5955 Guessing the Dice Roll AC自动机+高斯消元
- Hdu 5955 Guessing the Dice Roll 概率DP+高斯消元
- 2016icpc沈阳 HDU 5955 Guessing the Dice Roll AC自动机 高斯消元
- BZOJ1444:[Jsoi2009]有趣的游戏 (AC自动机+概率DP+高斯消元)
- AC自动机+高斯消元求解线性方程--2016icpc沈阳H
- HDU 5955 Guessing the Dice Roll AC自动机 高斯消元
- hdoj 3058 ac自动机+高斯消元
- UVALive 3490 Generator(AC自动机+dp+高斯消元)
- hdu 5955 Guessing the Dice Roll 概率DP,ac自动机,高斯消元 ★★
- Poj 3691 & Hdu 2457 DNA repair (AC自动机+DP)
- hdu 3359 Kind of a Blur (高斯消元 浮点型)
- HDU 2222 Keywords Search (AC自动机入门 模板)
- hdu 2222 Keywords Search(AC自动机)
- [hdu 1071]The area 高斯消元
- HDU 3359 高斯消元模板题,
- HDU - 5755 高斯消元解同余方程
- HDU 4418 Time travel (概率,高斯消元)