CF930B Game with String(思維)
阿新 • • 發佈:2020-12-08
一看資料範圍,顯然是平方演算法,這題的題意是,總共有n種情況,每次給你首字母,你可以任意選擇一個位置看更改後的字元是多少,問能猜測出答案的最大個數
因為給定了首字母再猜,那麼顯然對於首字母不同的情況他們是不干擾的,因此對首字母分類討論。
那麼對於每種情況,我們可以直接列舉選的位置,計算最大的答案取即可,最大的答案其實就是單獨數出現最多的位置。
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pll; const int N=2e5+10; constView Codeint mod=1e9+7; vector<int> num[N]; int st[30]; int main(){ //ios::sync_with_stdio(false); string s; cin>>s; int n; n=(int)s.size(); s=" "+s; int i,j; for(i=1;i<=n;i++){ int x=s[i]-'a'; num[x].push_back(i); } int cnt=0; for(int c=0;c<26;c++){ int res=0; for(i=2;i<=n;i++){ memset(st,0,sizeof st); for(auto x:num[c]){ int pos=(x+i-1); if(pos>n) pos-=n; st[s[pos]-'a']++; } int tmp=0;for(j=0;j<26;j++){ if(st[j]==1) tmp++; } res=max(res,tmp); } cnt+=res; } printf("%.8f\n",1.0*cnt/n); return 0; }