CF1800F Dasha and Nightmares

题解

设一个拼接之后的合法的字符串为 ,因为 中每个字符串中字母出现的次数都是奇数,所以长度也肯定是奇数,所以我们不用管第二个条件。

我们来看第三个条件,恰好有 个不同字母不好做,我们可以枚举那个没出现的字母。

我们设数组 和 ,分别表示第 个字符串,其中二进制的第 位如果等于 ,就表示字母出现次数为奇数和至少出现一次。

cpp 复制代码
for(int i=1;i<=n;i++){
        scanf("%s",c+1);
        m=strlen(c+1);
        for(int j=1;j<=m;j++){
            s[i]^=1<<(c[j]-'a');
            t[i]|=1<<(c[j]-'a');
        }
    }

我们定义一个函数 求出一个表示每个字符出现次数的字符串将第 位去掉之后将剩下的位不动的数传下去。

cpp 复制代码
int f(int S,int i){
    return ((S>>(i+1))<<i)+(S&((1<<i)-1));
}

然后我们枚举缺失的字母 和每个字符串 ,将所有没有字母 的字符串放到一个桶 里。我们再定义一个桶 表示字符串 去掉 的状态,也就是我们定义的 函数。

然后我们枚举每个状态,将答案变量加上枚举的状态异或上一个第 位是 ,其余都是 的掩码。

cpp 复制代码
for(int i=0;i<26;i++){//枚举缺失的字母 
        v.clear();
        for(int j=1;j<=n;j++){
            if((t[j]>>i)&1) continue;//包含字母i,跳过 
            v.push_back(s[j]);
            mp[f(s[j],i)]++;
        }
        for(int k : v){
            ans+=mp[f(k^(((1<<26)-1)^(1<<i)),i)];
        }
        for(int k : v){
            mp[f(k,i)]=0;
        }
    }

代码

cpp 复制代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5,M=5e6+5;
int n,m,t[N],s[N],mp[M<<3],ans;//s表示奇偶性,t表示出现 
char c[M];
vector<int> v;
int f(int S,int i){
    return ((S>>(i+1))<<i)+(S&((1<<i)-1));
}
signed main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++){
        scanf("%s",c+1);
        m=strlen(c+1);
        for(int j=1;j<=m;j++){
            s[i]^=1<<(c[j]-'a');
            t[i]|=1<<(c[j]-'a');
        }
    }
    for(int i=0;i<26;i++){//枚举缺失的字母 
        v.clear();
        for(int j=1;j<=n;j++){
            if((t[j]>>i)&1) continue;//包含字母i,跳过 
            v.push_back(s[j]);
            mp[f(s[j],i)]++;
        }
        for(int k : v){
            ans+=mp[f(k^(((1<<26)-1)^(1<<i)),i)];
        }
        for(int k : v){
            mp[f(k,i)]=0;
        }
    }
    printf("%lld\n",ans>>1);    
    return 0;
}
相关推荐
严肃小白兔10 分钟前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Hhy_110732 分钟前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
青少儿编程课堂1 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
YSL0701241 小时前
C++基础
开发语言·c++
eggwyw2 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
jktantan2 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
曦樂~12 小时前
Cpp面筋
c语言·c++
道尔柯南12 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
Dream it possible!15 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊15 小时前
算法之双指针系列(一)
算法·leetcode