之前题目看错了。。
先用双倍字符串处理后效性 首先要确定一个结论:如果原串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); }