#include<bits/stdc++.h>
using namespace std;
#define maxn 1000050
#define IO ios::sync_with_stdio(false);cin.tie(0);
typedef long long ll;
ll T,n,k,suff[maxn],suf[maxn],pre[maxn],sum[maxn];
double ans[maxn],res;
string s;
int main(){
IO;
cin>>s;
int len=s.size();
suff[len+1]=0;
for(int i=len;i>=1;i--){
if(s[i-1]=='a' || s[i-1]=='e' || s[i-1]=='i' || s[i-1]=='o' || s[i-1]=='u' || s[i-1]=='y'){
suff[i]=suff[i+1]+1;
}
else
suff[i]=suff[i+1];
suf[len-i+1]=suff[i];
}
// for(int i=1;i<=len;i++){
// cout<<suf[i]<<" ";
// }
// cout<<endl;
pre[0]=0;
for(int i=1;i<=len;i++){
pre[i]=pre[i-1]+suf[i];
}
sum[len]=suf[len];
for(int i=len-1;i>=1;i--){
sum[i]=sum[i+1]+suf[i];
}
// for(int i=1;i<=len;i++){
// cout<<pre[i]<<" ";
//}
//cout<<endl;
for(int i=1;i<=len;i++){
ans[i]=(sum[len-i+1]-pre[i]+suf[i])*1.0/i;
// cout<<ans[i]<<" ";
}
// cout<<endl;
for(int i=1;i<=len;i++){
res+=ans[i];
}
printf("%.9f\n",res/(1.0*(len+1)*len/2));
return 0;
}
nim游戏
拿走一堆中的一些 使异或为0 对方必败的前i堆的方案数
64*n复杂度
化成二进制 前i个数当前此位二进制下1的个数有多少个
找到最高奇数个1的位置 有几个1就是几种方案
1010
1000
1111
——
最高位拿出1个1 补5 后面异或为0 取走3个 本位偶数个1 ^=0
#include <iostream>
using namespace std;
#define ll long long
const int maxn = 1e5 + 7;
ll a[maxn], p[maxn], ans;
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> a[i];
p[i] = p[i-1] xor a[i];
for(int j = 1; j <= i; j++)
if(a[j] > (p[j-1] xor p[j] xor p[i])) //a[j]> 其他的异或 a[j]>p[i]^a[j]
ans++;
cout << ans << endl;
}
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
ll n,a[maxn],p[maxn],cnt=1,f;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
cnt=1;f=0;
// for(int j=a[i];j>0;j>>=1){
// p[cnt++]+=j&1;
// }
while(a[i]){
p[cnt++]+=a[i]%2;
a[i]/=2;
}
for(int j=70;j>=1;j--){
if(p[j]&1) //奇数个1 取1个变偶数 1的个数就是方案数 补5使后面是偶数 自己拿走3 本位变为偶数个1
{
cout<<p[j]<<endl;
f=1;
break;
}
}
if(!f)
cout<<0<<endl; //没有奇数个数1的 异或为0 我必败
}
// for(int i=1;i<=4;i++){
// cout<<p[i]<<" ";
// }
// cout<<endl;
return 0;
}