vp的 觉得我的D很聪明所以来写一下(乐
D - Three Days Ago
题意就是 求所有字符出现次数均为偶数的字串数量
太笨了所以想了很久
我把 存在奇数个1 当作第2位是 2 那么 当经过了两次1 2^2 这个2 就变成了0
2 就是第二位 就是4 ...以此类推
所以我遍历一遍字符串 求出当前的异或 并记录到map里面
为了让整串为0的可以被算到 mp[0]初始值为1
例如 20230322
读入第1个的时候 mp[4]=1;
读入第2个的时候 mp[5]=1;
读入第6个的时候 mp[0]=2; 此时为2 ans+1;
读入第7个的时候 mp[4]=2;ans+1;
读入第8个的时候 mp[0]=3; 说明前面有2种匹配方法 ans+2
这样就得出答案了
#include<bits/stdc++.h> #define close std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) using namespace std; typedef long long ll; const ll MAXN = 5e5+7; const ll mod =1e9+7; const ll inf =0x3f3f3f3f; const ll INF =0x3f3f3f3f3f3f3f3f; #define int long long int dp[2][1024],p[20]; int pre[1024]; int lowbit(int x){ return x&-x; } int gcd(int x,int y){int k=0; if(x<y){k=x;x=y;y=k;}while(x%y!=0){k=x%y;x=y;y=k;}return y;} ll _power(ll a,int b){ll ans=1,res=a;while(b){if(b&1) ans=ans*res%mod;res=res*res%mod;b>>=1;}return ans%mod;} void solve(){ string s;cin>>s; int pp=1,bz=0; for(int i=0;i<=9;i++){ p[i]=pp; pp*=2; } int n=s.length(); int ans=0; pre[0]++; for(int i=0;i<n;i++){ int m=s[i]-'0'; bz=bz^p[m]; if(bz==0||pre[bz]!=0) ans+=pre[bz]; pre[bz]++; } cout<<ans; } signed main(){ solve(); }
虽然大家应该都是这样写的但我还是要发一下
- Beginner AtCoder Contest 295beginner atcoder contest 295 contest programming beginner atcoder beginner atcoder contest 296 beginner atcoder contest abcde beginner atcoder contest 335 beginner atcoder contest 332 beginner atcoder contest 328 beginner atcoder contest 315 beginner atcoder contest 334 beginner atcoder contest 310