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;
}
相关推荐
ShineWinsu1 分钟前
对于C++:缓冲区管理的详细解析
linux·c++·面试·编程·笔试·io·缓冲区
GeekZHR15 分钟前
C语言指针2:数组名、二级指针、指针数组,一次把“指针和数组“讲透
c语言·数据结构·算法·指针
h_a_o777oah17 分钟前
【算法基础】卡特兰数:递推定义与折线对称公式推导及解题策略
c++·算法·acm·组合数学·卡特兰数·反射原理·动态规划dp
帅气的小峰25 分钟前
pybind11与nanobind可以共存吗?如何迁移?
c++·python·cuda·推理引擎
JAI科研26 分钟前
Deepseek Agent Harness教程(二) | DeepSeek Harness 设计思路
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·vllm
还不秃顶的计科生31 分钟前
具身智能论文学习10:π0: A Vision-Language-Action Flow Model for General Robot Control
人工智能·深度学习·算法·机器学习·语言模型·vla·vlm
syker37 分钟前
SuperNova Compiler v4.2.9 完整开发手册
c++
happyprince39 分钟前
02-具体观 — Cordis 算法与实现剖析
算法
zhy2956342 分钟前
在 QAIRT Genie SDK 上部署 Llama 3.2 1B 模型:从环境准备到 C++ 推理
开发语言·c++·llama
烬羽43 分钟前
求第 K 大,为什么反而要用最小堆?
javascript·数据结构·算法