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);
    }
  • 相关阅读:
    隐式类型转换
    STL::allocator rebind
    Proxy Class(代理类)
    C++ 没有合适的默认构造函数(无参数构造函数)
    E
    C
    Multiplication Puzzle POJ
    Brackets POJ
    Halloween Costumes LightOJ
    ACwing 139. 回文子串的最大长度(二分+Hash)
  • 原文地址:https://www.cnblogs.com/zsben991126/p/11069109.html
Copyright © 2011-2022 走看看