Vasya and Kolya play a game with a string, using the following rules. Initially, Kolya creates a string s, consisting of small English letters, and uniformly at random chooses an integer k from a segment [0, len(s) - 1]. He tells Vasya this string s, and then shifts it k letters to the left, i. e. creates a new string t = sk + 1sk + 2... sns1s2... sk. Vasya does not know the integer k nor the string t, but he wants to guess the integer k. To do this, he asks Kolya to tell him the first letter of the new string, and then, after he sees it, open one more letter on some position, which Vasya can choose.
Vasya understands, that he can't guarantee that he will win, but he wants to know the probability of winning, if he plays optimally. He wants you to compute this probability.
Note that Vasya wants to know the value of k uniquely, it means, that if there are at least two cyclic shifts of s that fit the information Vasya knowns, Vasya loses. Of course, at any moment of the game Vasya wants to maximize the probability of his win.
The only string contains the string s of length l (3 ≤ l ≤ 5000), consisting of small English letters only.
Print the only number — the answer for the problem. You answer is considered correct, if its absolute or relative error does not exceed 10 - 6.
Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if
technocup
1.000000000000000
tictictactac
0.333333333333333
bbaabaabbb
0.100000000000000
In the first example Vasya can always open the second letter after opening the first letter, and the cyclic shift is always determined uniquely.
In the second example if the first opened letter of t is "t" or "c", then Vasya can't guess the shift by opening only one other letter. On the other hand, if the first letter is "i" or "a", then he can open the fourth letter and determine the shift uniquely.
题意:没看懂。
解题思路:看了别人的博客终于搞懂了题意。首先要注意几点
1.问的是最大胜率,就是最后猜K猜的对不对!而不是猜字母。
2.K有strlen(str)种情况!
3.所以胜率就是,猜每种距离的胜率之和。
4.所以无论第一个字母是啥,第二个字母是啥,我只关心你猜的K对不对。
5.Kolya是可以作弊的!只要你不能唯一的确定这个字符串,那么你必输!
所以第二个样例的0.333333是这样来的
tictictactac
一共有4种字母,12种K
假设第一个字母是t,你的胜率为0
假设第一个字母是i,那么要使概率最大,你必须挑第四个或第七字母,你的胜率才能为1,这里占了两种K
假设第一个字母是c,那么你的胜率为0
假设第一个字母是a,情况跟i一样。
那么最后的胜率就是 4/12=0.333333333333333
算法:https://blog.csdn.net/qq_29556211/article/details/79524639
#include <bits/stdc++.h>
using namespace std;
int cnt[26][26][5000 + 5];
int main()
{
string str;
cin >> str;
for(int i = 0; i < str.size(); i++)
{
for(int len = 1; len < str.size(); len++)
{
cnt[str[i] - 'a'][str[(i + len) % str.size()] - 'a'][len]++;
}
}
double ans = 0;
for(int i = 0; i < 26; i++)
{
int mx = 0;
for(int len = 1; len < str.size(); len++)
{
int temp = 0;
for(int j = 0; j < 26; j++)
{
if(cnt[i][j][len] == 1)
temp++;
}
mx = max(mx, temp);
}
//cout<<mx<<endl;
ans += 1.0 * mx / str.size();
}
printf("%.8f\n", ans);
return 0;
}