首页 > 其他分享 >CF1800F 题解

CF1800F 题解

时间:2024-03-05 19:36:01浏览次数:28  
标签:26 CF1800F int 题解 bmod num 字符串 define

Solution

考虑转化题目条件,因为要求字符串恰好有 \(25\) 个字符,所以考虑枚举没出现过的字符,令其为 \(k\)。再令 \(f_{i,p}\) 表示第 \(i\) 个字符串 \(p\) 字符出现次数的奇偶,于是题目条件即为:

  • \(f_{i,k}=f_{j,k}=0\)。
  • \(f_{i,p}+f_{j,p} \bmod 2=1\)。

于是考虑用一个 \(2^{26}\) 的桶或 bitset 表示出每个字符串,即如果 \(f_{i,p} \bmod 2=1\),\(num \gets num+2^p\),把 \(num\) 放入桶,统计答案的时候将 \(f_{i,p} \bmod 2=0\) 的 \(j\) 加入 \(num\) 即可,时间复杂度为 \(O(nV^2)\),\(V\) 为 \(26\)。

#include<bits/stdc++.h>
#define ll long long 
#define x first 
#define y second 
#define il inline 
#define debug() puts("-----") 
using namespace std; 
typedef pair<int,int> pii; 
const int N=2e5+10,M=26; 
int n; 
int f[N][M]; 
string s[N]; 
int mp[1<<M]; 
bool st[N][M]; 
il void work(){ 
    cin>>n; ll ans=0; 
    for(int i=1;i<=n;i++){ 
        cin>>s[i]; 
        for(int j=0;j<M;j++) f[i][j]=0; 
        for(int j=0;j<s[i].size();j++) f[i][s[i][j]-'a']++,st[i][s[i][j]-'a']=true; 
    } for(int k=0;k<M;k++){ 
        for(int i=1;i<=n;i++){ 
            if(st[i][k]) continue; int num=0; 
            for(int j=0;j<M;j++) if(f[i][j]&1) num+=(1<<j); 
            mp[num]++;  
        } for(int i=1;i<=n;i++){ 
            if(st[i][k]) continue; int num=0; 
            for(int j=0;j<M;j++) if(j!=k&&(!(f[i][j]&1))) num+=(1<<j); 
            ans+=1ll*mp[num]; 
        } for(int i=1;i<=n;i++){ 
            if(st[i][k]) continue; int num=0; 
            for(int j=0;j<M;j++) if(f[i][j]&1) num+=(1<<j); 
            mp[num]--; 
        } 
    } printf("%lld\n",ans/2); 
} 
signed main(){ 
    int T=1; 
    while(T--) work(); return 0; 
} 

标签:26,CF1800F,int,题解,bmod,num,字符串,define
From: https://www.cnblogs.com/Celestial-cyan/p/18054722

相关文章

  • CF622F The Sum of the k-th Powers 题解
    原式为\(k+1\)次多项式,所以需要\(k+2\)个点确定。然后转化,前缀和。\[\begin{equation}n=k+2\\\end{equation}\]\[\begin{equation}f(x)=\sum\limits_{i=0}^{n}y_i\prod\limits_{j=0,j\nei}^{n}\frac{x-x_j}{x_i-x_j}\end{equation}\]\[\begin{equation}x_0=......
  • AT_abc331_f [ABC331F] Palindrome Query 题解
    分析线段树。每个节点维护两个值:$s[l\dotsr]$和$s[r\dotsl]$。判断字串是否是回文直接就是询问的答案维护出来的两个值是否相同。首先想到用线段树暴力维护。第一个值很显然是两个儿子的第一个值加起来,第二个值是反着加起来。得到很酷的代码:ilvoidup(intnow){ tr[now......
  • AT_abc287_g [ABC287G] Balance Update Query 题解
    分析一眼分块。用值域分块来维护。先把所有的值离散化,使得至于不大于$n+q$。统计一下每个值的数量,每个块包含值的数量,每个块的价值和。修改值的时候先把原来值的数量,块包含的数量,块的价值剪掉被修改值的贡献,然后在新的值上面更新。修改数量直接改数量的变化贡献即可。找前$x$......
  • P8844 [传智杯 #4 初赛] 小卡与落叶 题解
    分析乱搞题。$1\len,m\le10^5$的时候就可以考虑乱搞了。发现每次操作$1$都会把上一次的操作$1$覆盖掉,那么第$i$个询问时树的颜色情况就是由前$1$个操作$1$决定。也就是说这个询问的内容变成了:在$x$为根的子树中,深度不小于$x'$的节点数量。$x'$是该操作$1$......
  • AT_abc287_g [ABC287G] Balance Update Query 题解2
    分析权值线段树。给每个节点赋一个值$val$和$a_i=val$的$b_i$之和。修改$a_x$的时候先将$a_x$的出现次数在树上剪掉$b_x$,再在$y$上面加上;修改$b_x$的时候直接加上变化量$y-b_x$。由于我们是要取前$x$大的$a_i$之和,在询问的时候有限考虑右儿子,然后在是当前......
  • AT_abc335_f [ABC335F] Hop Sugoroku 题解
    比E简单。分析考虑暴力DP。定义状态函数$f_i$表示最后一个黑点为$i$时的方案数,有:$f_i=\sum\limits_{j=1}^{i-1}f_j[(i-j)\bmodval_j=0]$。不难发现在使用刷表法的时候,转移代码:for(reintj=1;i+val[i]*j<=n;++j)f[i+val[i]*j]=(f[i+val[i]*j]+f[i])%p;这玩意复杂......
  • AT_abc190_e [ABC190E] Magical Ornament 题解
    分析考虑状压。定义状态函数$f_{i,j}$表示在得到$C$出现过的状态为$i$且排列末尾为$j$时的最小代价。则有转移方程:$f_{i,j}=\min{f_{i',k}+dis_{k,j}}$,保证$i'$表示集合属于$i$。$dis_{i,j}$跑最短路就行了,通过枚举$C_i$为起点可以做到$O(kn\logn)$的复杂度求......
  • CF1800F Dasha and Nightmares 题解
    分析考虑枚举。注意到第二个条件是必须要有$25$个字符在里面出现过,故考虑枚举唯一没出现过的字符$k$,然后再枚举$s_i$。令$cnt_{i,j}$表示$s_i$中字符$c$出现的奇偶性。如果有字符$c\nek\landcnt_{i,c}=0$,则在$s_j$中必有$cnt_{j,c}=1$;反之同理。枚举字符$c......
  • P5655 基础数论函数练习题 题解
    分析考虑莫队。令$S=\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1})$。则对于新加进来的$a_r$,有:$$\operatorname{lcm}(a_l,a_{l+1},a_{l+2},\dots,a_{r-1},a_r)\=\operatorname{lcm}(S,a_r)\=\frac{S\timesa_r}{\gcd(S,a_r)}$$很容易发现,$S$在不取模的情况下会......
  • CF163A Substring and Subsequence 题解
    分析考虑DP。定义状态函数$f_{i,j}$表示在$s[1\dotsi]$中选一个子串$a$,在$t[1\dotsj]$中选一个子序列$b$,且$s_i,t_j$必选时$a=b$的方案数。则有两种情况:$s_i\net_j$。此时$a$和$b$是不可能相同的了,所以$f_{i,j}=0$。$s_i=t_j$。在只选$s_i,t_j$时......