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;
}

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...