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;
}
相关推荐
HPtiger4 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训5 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen5 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy5 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据5 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
把我格子衫拿来5 小时前
VTK 9.5 与 Qt 6 联合开发:从嵌入三维窗口到可维护的桌面架构
c++·python·qt·vtk·三维可视化
无忧.芙桃6 小时前
C++语言原理与实践(十六):多态机制讲解
开发语言·c++·多态
erzong2317 小时前
Linux操作系统:线程概念与控制
linux·算法
wuminyu7 小时前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
Nil2088 小时前
leetcode 5最长回文子串
算法·leetcode·职场和发展