题目链接:http://codeforces.com/contest/931/problem/E
题意:S和Y玩游戏,S首先在纸上写一个长度为n的字符串给Y看,之后在心里将这个字符串循环移位k位
然后把循环移位之后字符串的第一个字符告诉Y,并且允许Y再得到任意一个位置上的字符
如果Y能100%确定S心里所想的k是多少,就获胜,否则就失败
假设选择k时是随机均匀的,Y很聪明,求Y的胜率
这题题意还是很绕,不过n只有5000,所以你基本只要暴力所有情况就行了
我的方法是暴力所有的第一个字母,对于第一个字母再暴力Y所选的位置,对于所有位置中选个最优的算出概率加上去
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[5005];
int loc[5005], sum[33];
int main(void)
{
char ch;
int n, i, j, k, cnt, sco, bet;
double ans;
scanf("%s", str+1);
n = strlen(str+1);
ans = 0;
for(ch='a';ch<='z';ch++)
{
cnt = 0;
for(i=1;i<=n;i++)
{
if(str[i]==ch)
loc[++cnt] = i;
}
if(cnt==0)
continue;
bet = 0;
for(j=1;j<=n-1;j++)
{
memset(sum, 0, sizeof(sum));
for(k=1;k<=cnt;k++)
sum[str[(loc[k]+j-1)%n+1]-'a']++;
sco = 0;
for(k=0;k<=30;k++)
{
if(sum[k]==1)
sco++;
}
bet = max(bet, sco);
}
ans += 1.0*bet;
}
printf("%.10f\n", ans/n);
return 0;
}