zoukankan      html  css  js  c++  java
  • 概率+后效性处理——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
    ",1.0*sum/n);
    }
  • 相关阅读:
    2016四川省赛 Floyd-Warshall
    CF374 Maxim and Array
    CF374 Journey
    hdu5730 Shell Necklace
    hihocoder1388 Periodic Signal
    hihocoder1391 Country
    hdu 5903 Square Distance
    hdu5904 LCIS
    Python学习-2.安装IDE
    Python学习-1.安装Python
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11069109.html
Copyright © 2011-2022 走看看