Codeforces Round 855 (Div. 3) F. Dasha and Nightmares(题解 + 详细思考过程讲解)
创始人
2024-05-28 15:07:39
0

F. Dasha and Nightmares(二进制)

链接:F. Dasha and Nightmares

题目最重要的破题点思路 即第4点 由某银牌佬提供,唉膜拜大佬。

题意

给定 nnn 个字符串,(1<=n<=2∗105)(1 <=n<=2 * 10^5)(1<=n<=2∗105) 字符串长度之和不超过 5∗1065 *10^65∗106。
求字符串对si,sjsi,sjsi,sj个数,要满足以下条件
条件1.拼接后恰好有 252525 种字母。
条件2.拼接后每个字母个数为奇数。

题解 + 思考过程

1. 最开始想到用二进制,将每个字符串转化为一个长度为 262626 的二进制数,字符 chchch 的个数, 奇数 =1=1=1 ,偶数 =0=0=0
例如 str="a"str = "a"str="a" 二进制串 =1000……= 1000……=1000……, str="ab"=1100……str = "ab" = 1100……str="ab"=1100……, str="aab"=0100……str = "aab" = 0100……str="aab"=0100……
对于条件1:可以想到对于每个字符串枚举哪一个字符舍去。
对于条件2:用位运算直接去找到合法的,异或全 111 二进制数再减去应该舍去的字符位上的1。

2. 但是必须只有 252525 个,但是偶数对应 000, 那么不知道该字符是否有,因为没有该字符为 000 也对应 000。
例如枚举字符 aaa 没有, 但字符串 str="aa"str = "aa"str="aa" ,那么该字符串代表的二进制为全 000,就可以和 字符串 "b∼z""b\sim z""b∼z" 拼接 但拼接后有262626个字母,显然不合法。

3. 于是想到用三进制来表示,0=00 = 00=0, 奇数 =1= 1=1 大于 000 的偶数 =2= 2=2, 用字典树去计算
但是由于 111 对应 000 和 222 (字符串该位上为 111,那么该位上为 000 或 222 的都可以与之拼接)
这样递归时间复杂度可能达到 222 的幂次方级别。不可行。

4. 最后想到 枚举的不存在的那个字符,只有两个字符串都没有该字符才能拼接后满足。
所以我们可以每次遍历不存在 字符 chchch 的字符串集合,这样就不用考虑该位的 000 是大于 000 的偶数还是 000 的问题了。
因为除了我们枚举的该位必须不存在的其他字符 都必须为奇数,所以至少存在,对应拼接的是 000 还是大于 000 的偶数就无所谓了。
可以直接采取1.做法,不过需要在每次计算后清除贡献。(如果不清除,影响可以参考2.)。

代码

#include 
#include 
#include 
using namespace std;
#define ll long long
const int N = 2e5 + 10, M = 1 << 26;
const int K = (1 << 26) - 1;//长度为26的全1二进制数
string s[N];
int t[N], val[M];//t[i]:转化后二进制数 val[i]:计数
vectorg[26];//g[i]:没有字符i的字符串的下标
int main()
{ios::sync_with_stdio(false);cout.tie(NULL);int n;cin >> n;for(int i = 1; i <= n; i ++){cin >> s[i];int len = s[i].length();int vis[30] = {0};for(int j = 0; j < len; j ++){vis[s[i][j] - 'a'] ++;}int num = 0;for(int j = 0; j < 26; j ++){if(vis[j] & 1) num += (1 << j);if(!vis[j]) g[j].push_back(i);}t[i] = num;}ll ans = 0;for(int i = 0; i < 26; i ++){//枚举没有i字符的字符串,只有都没有某个字符的字符串才能匹配for(int id : g[i]){val[t[id]] ++;int v = t[id] ^ K ^ (1 << i);//能与si拼接的字符串所代表的二进制数ans += val[v];}for(int id : g[i]) val[t[id]] --;//清除贡献}cout << ans;return 0;
}

相关内容

热门资讯

绿地控股涨1.73%,成交额8... 5月6日,绿地控股涨1.73%,成交额8314.34万元,换手率0.34%,总市值247.35亿元。...
山东路桥涨1.25%,成交额7... 5月6日,山东路桥涨1.25%,成交额7967.11万元,换手率0.97%,总市值88.35亿元。异...
集成电路ETF(159546)... 5月6日,国泰中证全指集成电路ETF(159546)收盘涨1.56%,成交额1259.29万元。集成...
蓝丰生化涨6.54%,成交额1... 5月6日,蓝丰生化涨6.54%,成交额1.15亿元,换手率9.66%,总市值17.11亿元。异动分析...
开创国际涨1.76%,成交额6... 5月6日,开创国际涨1.76%,成交额6590.24万元,换手率2.81%,总市值23.64亿元。异...
华金资本涨2.66%,成交额1... 5月6日,华金资本涨2.66%,成交额1.61亿元,换手率3.22%,总市值50.50亿元。异动分析...
通富微电涨2.26%,成交额8... 5月6日,通富微电涨2.26%,成交额8.33亿元,换手率2.11%,总市值397.61亿元。异动分...
老板电器涨0.92%,成交额1... 5月6日,老板电器涨0.92%,成交额1.97亿元,换手率1.07%,总市值186.63亿元。异动分...
ST易联众涨3.56%,成交额... 5月6日,ST易联众(维权)涨3.56%,成交额3545.80万元,换手率2.04%,总市值17.5...
精准服务送政策 税惠助企添动能 转自:廊坊日报 本报讯(记者 杨苗苗 通讯员 张娜)大厂回族自治县税务局扎实开展“税企面对面...
华东数控涨2.60%,成交额9... 5月6日,华东数控涨2.60%,成交额9631.52万元,换手率3.82%,总市值25.46亿元。异...
尚荣医疗涨1.56%,成交额3... 5月6日,尚荣医疗涨1.56%,成交额3477.65万元,换手率1.75%,总市值27.56亿元。异...
力合科创涨1.21%,成交额1... 5月6日,力合科创涨1.21%,成交额1.41亿元,换手率1.40%,总市值101.21亿元。异动分...
神州泰岳(300002.SZ)... 格隆汇5月6日丨神州泰岳(300002.SZ)在投资者互动平台表示,公司与DeepSeek不存在合作...
万泽股份涨0.13%,成交额9... 5月6日,万泽股份涨0.13%,成交额9116.34万元,换手率1.18%,总市值78.04亿元。异...
中远海发涨1.34%,成交额1... 5月6日,中远海发涨1.34%,成交额1.34亿元,换手率0.60%,总市值303.20亿元。异动分...
协鑫集成涨4.74%,成交额2... 5月6日,协鑫集成涨4.74%,成交额2.05亿元,换手率1.61%,总市值129.29亿元。异动分...
松芝股份涨2.72%,成交额2... 5月6日,松芝股份涨2.72%,成交额2.08亿元,换手率4.44%,总市值47.52亿元。异动分析...
海陆重工涨停,成交额6.96亿... 5月6日,海陆重工(维权)涨停,成交额6.96亿元,换手率12.15%,总市值76.52亿元。异动分...
*ST宝鹰涨4.22%,成交额... 5月6日,*ST宝鹰涨4.22%,成交额1.60亿元,换手率6.52%,总市值26.23亿元。异动分...