zoukankan      html  css  js  c++  java
  • [TyvjP1519] 博彩游戏(AC自动机 + DP)

    传送门

    和bzoj1030一个德性

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #define N 500001
    #define LL long long
    
    int m, n, r, cnt;
    LL f[61][N], ans, sum = 1;
    int next[N][10], fail[N];
    bool val[N];
    char s[N];
    std::queue <int> q;
    
    inline void insert()
    {
    	int i, x, now = 0, len = strlen(s + 1);
    	for(i = 1; i <= len; i++)
    	{
    		x = s[i] - '0';
    		if(!next[now][x])
    			next[now][x] = ++cnt;
    		now = next[now][x];
    	}
    	val[now] = 1;
    }
    
    inline void make_fail()
    {
    	int i, now;
    	for(i = 1; i <= r; i++)
    		if(next[0][i])
    			q.push(next[0][i]);
    	while(!q.empty())
    	{
    		now = q.front();
    		q.pop();
    		for(i = 1; i <= r; i++)
    		{
    			if(!next[now][i])
    			{
    				next[now][i] = next[fail[now]][i];
    				continue;
    			}
    			fail[next[now][i]] = next[fail[now]][i];
    			val[next[now][i]] |= val[next[fail[now]][i]];
    			q.push(next[now][i]);
    		}
    	}
    }
    
    int main()
    {
    	int i, j, k;
    	scanf("%d %d %d", &m, &n, &r);
    	for(i = 1; i <= n; i++)
    	{
    		scanf("%s", s + 1);
    		insert();
    	}
    	make_fail();
    	for(i = 1; i <= m; i++) sum *= r; 
    	f[0][0] = 1;
    	for(i = 1; i <= m; i++)
    		for(j = 0; j <= cnt; j++)
    		{
    			if(val[j] || !f[i - 1][j]) continue;
    			for(k = 1; k <= r; k++)
    				if(!val[next[j][k]])
    					f[i][next[j][k]] += f[i - 1][j];
    		}
    	for(i = 0; i <= cnt; i++) ans += f[m][i];
    	printf("%.5lf
    ", double(sum - ans) / double(sum));
    	return 0;
    }
    

      

  • 相关阅读:
    3.1 创建模型-实体属性
    3. 创建模型
    2.1 DbContext
    2. EF Core 如何显示执行的SQL语句
    1.1 为现有数据库生成实体模型
    1. EF Core 概述
    【2020-08-01】人生十三信条
    【一句日历】2020年8月
    【2020-07-31】一个像我一样精力充沛的孩子
    【2020-07-30】强大内心是自己的义务
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/7521785.html
Copyright © 2011-2022 走看看