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;
}
相关推荐
浅念-16 分钟前
LeetCode 回溯算法题——综合练习
数据结构·c++·算法·leetcode·职场和发展·深度优先·dfs
列星随旋1 小时前
线段树和树状数组的学习
学习·算法
楼田莉子1 小时前
C++17新特性:__had_include/属性/求值顺序规则
开发语言·c++·后端
全糖可乐气泡水3 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah3 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师3 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠4 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc
雪度娃娃4 小时前
Asio异步读写——连接的安全回收问题
开发语言·c++·安全·php
珊瑚里的鱼5 小时前
leetcode42雨水
算法·leetcode
不吃土豆的马铃薯5 小时前
Spdlog 进阶:日志基本控制、日志格式控制、异步记录器
linux·服务器·开发语言·前端·c++