bzoj1444 [Jsoi2009]有趣的游戏
2018-04-04 01:51
357 查看
http://www.elijahqi.win/archives/2894
![](https://img-blog.csdn.net/20180404014815409?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsaWphaHFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180404014832133?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsaWphaHFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180404014845811?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsaWphaHFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/20180404015042918?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsaWphaHFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
![](https://img-blog.csdn.net/201804040150539?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2VsaWphaHFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
#include<queue> #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> #define N 110 using namespace std; inline int read(){ int x=0;char ch=getchar(); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x; } bool ed ;int end ,trans [26],cnt=1,fail ; inline void insert1(char s[],int id){ int len=strlen(s+1);int p=1; for (int i=1,nxt;i<=len;++i){ if (!trans[p][s[i]-'A']) trans[p][s[i]-'A']=nxt=++cnt; else nxt=trans[p][s[i]-'A'];p=nxt; }end[id]=p;ed[p]=1; } inline void buildAC(){ queue<int>q;q.push(1);for (int i=0;i<26;++i) trans[0][i]=1; while(!q.empty()){ int x=q.front();q.pop(); for (int i=0;i<26;++i){ int &y=trans[x][i]; if (y) fail[y]=trans[fail[x]][i],q.push(y); else {y=trans[fail[x]][i];continue;}ed[y]|=ed[trans[fail[x]][i]]; } } } struct matrix{double f ;}ans,ans1; inline matrix multiply(const matrix &a,const matrix &b){ matrix c;memset(c.f,0,sizeof(c.f)); for (int i=1;i<=cnt;++i) for (int k=1;k<=cnt;++k) for (int j=1;j<=cnt;++j) c.f[i][j]+=a.f[i][k]*b.f[k][j]; return c; } int n,l,m,pp,q;double p ;char s ; int main(){ freopen("bzoj1444.in","r",stdin); n=read();l=read();m=read(); for (int i=0;i<m;++i) pp=read(),q=read(),p[i]=(double)pp/q; for (int i=1;i<=n;++i) scanf("%s",s+1),insert1(s,i);buildAC(); for (int i=1;i<=cnt;++i){ if(ed[i]) {ans.f[i][i]=1;continue;} for (int j=0;j<m;++j) { int y=trans[i][j];ans.f[i][y]+=p[j]; } }//for (int i=1;i<=cnt;++i) ans1.f[i][i]=1; //for (int t=50;t;ans=multiply(ans,ans),t>>=1) if(t&1) ans1=multiply(ans1,ans); for (int i=1;i<=50;++i) ans=multiply(ans,ans); for (int i=1;i<=n;++i) printf("%.2f\n",ans.f[1][end[i]]); return 0; }
相关文章推荐
- bzoj 1444 [Jsoi2009]有趣的游戏
- Bzoj1444 [Jsoi2009]有趣的游戏
- 【 bzoj 1444 】 [Jsoi2009]有趣的游戏 - AC自动机+矩阵乘法
- BZOJ 1444: [Jsoi2009]有趣的游戏
- BZOJ1444:[Jsoi2009]有趣的游戏 (AC自动机+概率DP+高斯消元)
- 【bzoj1444】[Jsoi2009]有趣的游戏
- bzoj 1444: [Jsoi2009]有趣的游戏【AC自动机+dp+高斯消元】
- BZOJ 1444: [Jsoi2009]有趣的游戏 [AC自动机 高斯消元]
- [AC自动机 概率DP 矩阵乘法||高斯消元] BZOJ 1444 [Jsoi2009]有趣的游戏
- BZOJ:4820: [Sdoi2017]硬币游戏&&BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
- 【bzoj1444】【jsoi2009】【有趣的游戏】【AC自动机+矩阵乘法】
- BZOJ1444: [Jsoi2009]有趣的游戏 矩阵求逆+AC自动机
- BZOJ 1444 [Jsoi2009]有趣的游戏 (AC自动机 + 概率DP + Gauss)
- BZOJ 1444: [Jsoi2009]有趣的游戏
- bzoj1444 [Jsoi2009]有趣的游戏(期望概率+AC自动机+高斯消元)
- BZOJ1444 : [Jsoi2009]有趣的游戏
- 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法
- bzoj1444 [Jsoi2009]有趣的游戏
- ●BZOJ 1444 [Jsoi2009]有趣的游戏
- bzoj1444 [Jsoi2009]有趣的游戏(ACAM+矩阵+概率dp)