传送门

感觉这题难点在读懂题。

题目简述:给你一个字符串s,设将其向左平移k个单位之后的字符串为t,现在告诉你t的第一个字符,然后你可以另外得知t的任意一个字符,求用最优策略猜对k的概率。


解析:

预处理出一个数组cnti,j,kcnt_{i,j,k}cnti,j,k​表示一段字串开头为iii,结尾为jjj,字串长度为k+1k+1k+1的字串数量。

然后如果cnti,j,k=1cnt_{i,j,k}=1cnti,j,k​=1说明如果给出的开头是iii,并且第k+1k+1k+1个是jjj的话就一定能猜对。

所以对于每一个开头为iii的,字串长度为kkk的,如果有lll个jjj满足cnti,j,k=1cnt_{i,j,k}=1cnti,j,k​=1说明如果我们问第k+1k+1k+1个字母是什么有l/26l/26l/26的概率猜对。

所以对于每一种开头枚举所有的kkk求出概率的最大值,加起来就是答案。

总概率等于26∗(∑li26)∗1n=∑lin26*(\sum\frac{l_i}{26})*\frac1 n=\sum\frac{l_i}n26∗(∑26li​​)∗n1​=∑nli​​

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=5e3+5,S=26;
int cnt[S][S][N],n;
char s[N];
int main(){
	scanf("%s",s+1),n=strlen(s+1);
	for(ri i=1;i<=n;++i)for(ri j=1;j<n;++j)++cnt[s[i]-'a'][s[i+j>n?i+j-n:i+j]-'a'][j];
	double ans=0.0;
	for(ri i=0,mx=0;i<26;++i,mx=0){
		for(ri tmp=0,j=1;j<=n;++j,tmp=0){
			for(ri k=0;k<26;++k)if(cnt[i][k][j]==1)++tmp;
			mx=max(mx,tmp);
		}
		ans+=1.0*mx/n;
	}
	printf("%.15lf",ans);
	return 0;
}

2018.12.12 codeforces 931E. Game with String(概率dp)的更多相关文章

  1. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  2. CodeForces 931E Game with String

    Game with String 题意:有一个字符串,可以选择从第K位开始,将[K,len(s)-1]的字符都移到前面去,现在给你一个首字母,你可以再选择一位进行观察,然后猜测这个K的值是多少, 现在 ...

  3. codeforces 710E Generate a String(简单dp)

    传送门:http://codeforces.com/problemset/problem/710/E 分析: 让你写一个全由"a"组成的长为n的串,告诉你两种操作,第一种:插入一个 ...

  4. CodeForces - 710E Generate a String (dp)

    题意:构造一个由a组成的串,如果插入或删除一个a,花费时间x,如果使当前串长度加倍,花费时间y,问要构造一个长度为n的串,最少花费多长时间. 分析:dp[i]---构造长度为i的串需要花费的最短时间. ...

  5. CodeForces 148D-Bag of mice(概率dp)

    题意: 袋子里有w个白球b个黑球,现在两个人轮流每次取一个球(不放回),先取到白球的获胜,当后手取走一个球时,袋子里的球会随机的漏掉一个,问先手获胜的概率. 分析: dp[i][j]表示袋子中i个白球 ...

  6. Codeforces 148D Bag of mice 概率dp(水

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢 ...

  7. CodeForces 499D. Name That Tune(概率dp)

    It turns out that you are a great fan of rock band AC/PE. Peter learned that and started the followi ...

  8. Codeforces 513G1 513G2 Inversions problem [概率dp]

    转自九野:http://blog.csdn.net/qq574857122/article/details/43643135 题目链接:点击打开链接 题意: 给定n ,k 下面n个数表示有一个n的排列 ...

  9. Codeforces #28 C.Bath Queue (概率dp)

    Codeforces Beta Round #28 (Codeforces format) 题目链接: http://codeforces.com/contest/28/problem/C 题意: 有 ...

随机推荐

  1. goto,void,extern,sizeof分析

    goto: 程序的质量与goto出现的次数成反比,禁用 goto的副作用:破环了程序的结构化的顺序执行的过程,它有可能会跳过程序的应该执行的一些步骤. void: 修饰函数返回值和参数 c语言中没有定 ...

  2. PAT L3-010 是否完全二叉搜索树(二叉搜索树)

    将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. 输入格式: 输入第一行给出一个不超过20的正整数 ...

  3. stark组件之搜索【模仿Django的admin】

    一.先看下django的admin是如何做搜索功能的 配置一个search_fields的列表就可以实现搜索的功能 class testbook(admin.ModelAdmin): # 第一步,定义 ...

  4. java_12多态

    1多态概述 多态是继封装.继承之后,面向对象的第三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学生也是人,即出现两种形态. Java作为面向对象的语言,同样 ...

  5. Solidity通过合约转ERC20代币

    ERC20代币并不能像Ether一样使用sendTo.transfer(amt)来转账,ERC20代币只能通过token中定义的transfer方法来转账,每个账户的余额信息也只保存在token合约的 ...

  6. 【转】Javascript中使用WScript.Shell对象执行.bat文件和cmd命令

    WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript. ...

  7. 学习knockoutjs轻量级的MVVM框架

    教程:knockoutjs介绍 http://www.w3cfuns.com/forum.php?mod=viewthread&tid=5598714 MVVM架构~knockoutjs实现简 ...

  8. python sockerserver tcp 文件下载 udp

    #tcp serverclass MyHandler(socketserver.BaseRequestHandler): def handle(self): # 通信循环 while True: tr ...

  9. linux操作系统-源码包安装jdk1.7

    1.下载安装文件 在oracle官方找不到bin二进制安装文件只能使用rpm包来安装 下载地址:http://www.oracle.com/technetwork/java/javase/downlo ...

  10. oracle 使用exp命令 sys用户登录 导出表存为dmp文件

    在cmd下面,使用exp命令,格式为 exp \"sys/123456@dbname as sysdba\" file=d:\dmp\test.dmp tables=sys.tes ...