首页 > 其他分享 >2023第七场牛客多校-We Love Strings

2023第七场牛客多校-We Love Strings

时间:2023-08-08 12:22:22浏览次数:52  
标签:cnt Love int 第七场 多校 long add ans 字符串

I-We Love Strings_2023牛客暑期多校训练营7

题意

 做法:根号分治+容斥原理

将字符串分为两类:

  • len<=20直接位运算枚举出可能的所有答案,看是否存在符合的
  • len>20采用容斥原理,计算出所有长度为 i 的字符串中(假设为n个),1个字符串可以表示的 ( 1个元素的交集 )  ,2个字符串可以表示的( 2个元素的交集 ),.......,n个字符串可以表示的( n个元素的交集 )
  • 贡献就是 这 n 个长度为 i 的字符串的并集, 根据容斥原理选了奇数个字符串的应该加上,偶数个应该减去
#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define int long long
typedef long long ll;

const int N=405;
const int mod=998244353;

void add(int &a,int b){
    a+=b;
    if(a>=mod)a-=mod;
}

void del(int &a,int b){
    a-=b;
    if(a<0)a+=mod;
}

signed main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int n;cin>>n;
    map<int,vector<string>>mp;
    for(int i=1;i<=n;i++){
        string s;cin>>s;
        mp[(int)s.size()].push_back(s);
    }
    int ans=0;
    for(auto [len,s]:mp){
        int sz=(int)s.size();
        if(len<=20){
            for(int i=0;i<(1<<len);i++){
                for(int j=0;j<sz;j++){
                    bool ok=true;
                    for(int k=0;k<len;k++){
                        if(s[j][k]=='?')continue;
                        if(s[j][k]-'0'!=(i>>k&1)){
                            ok=false;
                            break;
                        }
                    }
                    if(ok){
                        add(ans,1);
                        break;
                    }
                }
            }
        }else{
            for(int i=1;i<(1<<sz);i++){
                int cnt=1;
                for(int j=0;j<len;j++){
                    bool ok1=false,ok0=false;
                    for(int k=0;k<sz;k++){
                        if((i>>k)&1){
                            if(s[k][j]=='0')ok0=true;
                            if(s[k][j]=='1')ok1=true;
                        }
                    }
                    if(ok0&&ok1){
                        cnt=0;
                        break;
                    }
                    //当当前位上全是"?",答案就乘2,意思是当前为可以全部取0或者全部取1
                    if(!ok0&&!ok1)add(cnt,cnt);
                }
                if(__builtin_popcount(i)&1)add(ans,cnt);
                else del(ans,cnt);
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}
View Code

 

标签:cnt,Love,int,第七场,多校,long,add,ans,字符串
From: https://www.cnblogs.com/zhujio/p/17613840.html

相关文章

  • 记一场很厉害的牛客多校
    破防场。全是诈骗提。但是很有可以学的东西!\(I.\)给定\(n\)个01?串,?可以替换为0或1。称替换完的串集合为该串的生成串。问所有\(n\)个串的生成串集合的并的大小。长度不同的串分开处理。对于长度\(\le20\)的串,暴力枚举生成串,map去重。对于长度\(>20\)的......
  • 2023年多校联训NOIP层测试2
    T1 斐波那契树题目思路题解做法:可以先把白色边权看成1,黑色边权看成0,求最小生成树和最大生成树,判断这两个值之间是否存在一个斐波那契数。可以证明这中间的值都是可以出现的(参考求恰好k条白边的思路,BZOJ2654)。我的做法:找到最小生成树和最大生成树的值。看它们是否在点击......
  • 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2
    2023年多校联训NOIP层测试4爆零了T1幸运数字\(0pts\)T2密码\(0pts\)没做到,咕了。T3小X和他的朋友们\(0pts\)没做到,咕了。T4树上询问\(0pts\)没做到,咕了。【LGR-150-Div.2】洛谷8月月赛I&RiOIRound2T1luoguP9496「RiOI-2」hacker\(100pts\)......
  • 2023年牛客多校第五场A
    1:题目链接https://ac.nowcoder.com/acm/contest/57359/A题意:给你一个数组,让你找出区间l,r之间满足l≤i<j<k≤r,ai=ak>aj的个数思路1:我们先找出当前位置x小于x的数有多少个例如:9854515158对应:0000102037你会发现假如有i,k,j满足,则个数为......
  • 2023牛客暑期多校训练营6 GEC
    2023牛客暑期多校训练营6G-Gcd题意:一开始给你一个集合\(S=\lbracex,y\rbrace(x\neqy)\)。然后你可以执行以下两个操作:1.从\(S\)中选择两个元素\(a,b(a\neqb)\),把\(a-b\)加入集合。2.从\(S\)选择2个元素是\(a,b(a\neqb)\),把\(gcd(|a|,|b|)\)加入集合里面。特别......
  • HDU 暑假多校 2023 第六场
    目录写在前面733673417345733773397338写在最后写在前面补题地址:https://acm.hdu.edu.cn/listproblem.php?vol=64,题号7336~7346。哈哈,单刷5题,我是只会做套路题的飞舞。Boc'z那个单曲太牛逼了,最喜欢的一首,但是live上唱的这首是真难绷。以下按个人向难度排序。7336显然......
  • 牛客暑假多校 2023 第六场
    目录写在前面GECBA写在最后写在前面比赛地址:https://ac.nowcoder.com/acm/contest/57360。哈基米牛魔酬宾,哈比下,哈比下,奥利安费,阿米诺斯!以下按照个人向难度排序。G\(a-b\)相当于辗转相减,\(\gcd(|a|,|b|)\)和直接\(\gcd\)没什么区别。于是当\(z=0\)时,\(x,y\)中一......
  • 2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 3
    2023年多校联训NOIP层测试3T1数列变换\(10pts\)考虑暴力,发现\(f\)数列进行一次变换\(A\),再进行一次变换\(B\)后,恢复成了原数列;\(f\)数列进行一次变换\(B\),再进行一次变换\(A\)后,也恢复成了原数列。即变换\(A\)可以和变换\(B\)相互抵消。本质是差分是前缀......
  • 【题解】[2023牛客多校] Distance
    题目传送门:[2023牛客多校]Distance题意对于任意两个元素个数相同的set:A、B,每次可以执行以下两种操作之一:将A中的任意元素加一将B中的任意元素加一\(C(A,B)\)含义为将\(A、B\)改变为完全相同的set所需要花费的最小次数;初始给你两个set:\(S、T\),计算\(\sum_{A\subs......
  • 牛客多校友谊赛
    D-吹_23暑假友谊赛No.2(nowcoder.com)#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;constintN=1e6+50,INF=0x3f3f3f3f;inta[N],dp[N][2];signedmain(){intn;cin>>n;for......