概率+后效性处理——cf930B好题

之前题目看错了。。

先用双倍字符串处理后效性 
首先要确定一个结论:如果原串s中相距为d的ch1和ch2只有一对,那么如果第一个翻开ch1,第二个翻开ch2,就能确定k
现在要求的是当我们第一次翻开的是ch1时,第二次翻哪个位置成功的概率最高
设这个概率为p,ans=sigma(cnti/n * pi),i∈['a','z']
那么我们枚举d,对每种字符找到这个最大的d即可 

.

#include<bits/stdc++.h>
using namespace std;
int n,mp[30][30][5005];
char s[5005<<1];

int main(){
    cin>>s;
    n=strlen(s);
    for(int i=0;i<n;i++)
        s[i+n]=s[i];
    for(int i=0;i<n;i++)
        for(int j=i+1;j<i+n;j++)
            mp[s[i]-'a'][s[j]-'a'][j-i+1]++;
    int    sum=0;
    for(int i=0;i<26;i++){//对于每个字符找d 
        int Max=0;
        for(int d=1;d<=n;d++){
            int tmp=0;
            for(int j=0;j<26;j++)
                if(mp[i][j][d]==1)tmp++;
            Max=max(Max,tmp);
        }
        sum+=Max;
    }
    printf("%.10lf\n",1.0*sum/n);
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/11069109.html