首页 > 其他分享 >Codeforces Round 855 (Div. 3) F

Codeforces Round 855 (Div. 3) F

时间:2023-03-07 15:22:13浏览次数:49  
标签:855 cnt int Codeforces 数组 字符串 Div define

F

核心思路

首先我们可以知道的是只要满足了条件2和条件3必然会满足条件1.因为奇数和奇数的乘积一定是奇数。这一个比较显而易见的性质。

然后就是我们需要思考我们得使用什么方式来表示我们的条件2和条件3的状态呢。这里就运用到了状态压缩的知识,也就是我们使用二进制序列来表示我们的状态,因为总共的状态也只有\(1<<26\).也就是只需要表示26个字母就好了。

集合定义

\(a[i]表示第i个字符串中每个字母的是否出现过\)

\(b[i]表示第i个字符串中每个字母出现的次数是否是奇数\)

接下来就是怎么预处理a数组和b数组呢,其实不难发现a数组的处理可以采用位或操作,而b数组可以采用异或操作。这个自己模拟下就好了。

因为题目只需要25个字母,所以我们可以枚举缺失的哪个字母。再就是从前往后枚举我们的字符串,假设当前枚举的是字符串i,先看他的是不是只缺少一个字符,也就是a[i]的状态,再就是先搞出来我们目标的b[i],再看那些字符串是不是有对应的b[i].

这些每个合法一半的状态可以采用cnt数组来存储。

// Problem: F. Dasha and Nightmares
// Contest: Codeforces - Codeforces Round 855 (Div. 3)
// URL: https://codeforces.com/contest/1800/problem/F
// Memory Limit: 512 MB
// Time Limit: 4000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define NO {puts("NO") ; return ;}
#define YES {puts("YES") ; return ;}
#define endl "\n"
const int N=1e6+10;
int n;
int a[N];
int b[N];
int cnt[1<<26];

signed main()
{
	IOS;
cin>>n;
for(int i=1;i<=n;i++)
{
	 string s;
	 cin>>s;
	 for(int j=0;j<s.size();j++)
	 {
	 a[i] |= (1 << (s[j] - 'a')), b[i] ^= (1 << (s[j] - 'a'));
	 }
}
LL ans=0;
for(int i=0;i<26;i++)
{
	int S=((1<<26)-1)-(1<<i);
	for(int j=1;j<=n;j++)
	{
		if(!(a[j]>>i&1))
		{
			cnt[b[j]]++;
			ans+=cnt[S^b[j]];
		}
	}
	for(int j=1;j<=n;j++)
	{
		if(!(a[j]>>i&1))
		cnt[b[j]]--;
	}
	
}
cout<<ans<<endl;
return 0;

}

标签:855,cnt,int,Codeforces,数组,字符串,Div,define
From: https://www.cnblogs.com/xyh-hnust666/p/17188229.html

相关文章

  • 33. CF-Divisor Paths
    链接求从\(x\)到\(y\)的最短路径的数量。显然应该从\(x\)走到\(\gcd(x,y)\)再走到\(y\),容易证明这样走是最优的。那么现在只需要把两段的最短路径数量分别求出......
  • Codeforces Round 855 (Div. 3)(E,F)
    CodeforcesRound855(Div.3)(E,F)在\(div2\)受虐久了,这次\(div3\)打的还蛮顺利的(虽然\(wa\)了好几次)EE题目大意就是有两个字符串,我们要通过以下两种操作把第一个字符变......
  • CF1789 Codeforces Round 853 (Div. 2) D. Serval and Shift-Shift-Shift
    https://codeforces.com/contest/1789/problem/D给定两个n位二进制数a,b,你可以每次使\(a=a\oplusa>>k\)或\(a=a\oplusa<<k\),你需要用不超过n次操作......
  • CF1793 Codeforces Round 852 (Div. 2) D. Moscow Gorillas
    https://codeforces.com/contest/1793/problem/D对于给定的两个长度为\(n\)的排列\(a_i,b_i\),定义\(MEX(S)\)为集合\(S\)中没有出现的最小的正整数,找出所有满足......
  • Codeforces Round 856 (Div. 2)
    《C.ScoringSubsequences》  这道题有很多解法:二分,双指针等,但是无论哪一种都要知道如下:想要得到当k时,最大的分数,那么就会贪心地将后面的数相乘再......
  • LeetCode 29. Divide Two Integers 题解教程 All In One
    LeetCode29.DivideTwoIntegers题解教程AllInOnehttps://leetcode.com/problems/divide-two-integers/description///functiondivide(dividend:number,divis......
  • Codeforces Round 855 (Div
    Problem-E2-UnforgivableCurse(hardversion)给定一个初始字符串s和目标字符串t,我们可以对字符串s进行以下任意次操作:对于位置\(i\),如果\(i+k+1<=s.length()\)......
  • Codeforces Round 855 (Div. 3)
    链接CodeforcesRound855(Div.3)A题这个题先将大写变小写然后将重复元素去除,判断是不是等于meow就可以#include<iostream>#include<algorithm>#include<cstdi......
  • Codeforces Global Round 3
    A   题解:显然就拼一下$a,b$然后再把$c$用完,记得判一下$a=b$的特殊情况。#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;consti......
  • CodeForces 1422F Boring Queries
    洛谷传送门CF传送门套路题。考虑根号分治,\(\le\sqrt{V}=447\)的质因子直接暴力ST表维护。对于\(>\sqrt{V}\)的质因子每个数最多有一个。记\(big_i\)为\(a_......