首页 > 其他分享 >Educational Codeforces Round 134 (Rated for Div. 2)

Educational Codeforces Round 134 (Rated for Div. 2)

时间:2022-08-28 10:55:38浏览次数:86  
标签:pre Educational Rated last int Codeforces ne -- define

Educational Codeforces Round 134 (Rated for Div. 2)

D. Maximum AND

题目大意

给出序列a,bb可以任意排列,序列c有\(c_i=a_i\bigoplus b_i\)。c序列的价值为c1&c2&c33...&cn

分析

不难想到,从高到底考虑,每一个\(a_i\)与\(b_i\)对应二进制位。假设考虑的是其中bit位,则需要所有的\(a_i\)与\(b_i\)的bit位中,每一个匹配的都两两不同,即\(a_i\)的bit位中1的数量等于b_i中0的数量,反之亦然。这样最后c的价值就可以在当前位取到1

则,很明显我们要进行分组操作,高位选择后,会将当前b的分组再次拆分。

分组操作是蛮经典的操作,可以考虑进行积累。我会在代码中加上注释,可以直接看代码。

Ac_code

#include <bits/stdc++.h>
#define fi first    
#define se second    
#define endl '\n'
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
using namespace std;
const int N = 1e5 + 10,M = N*2;
   
void solve() 
{
    int n;cin>>n;
    vector<int> a(n),b(n);
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++) cin>>b[i];
    vector<vector<int>> bb(1),aa(1);
    for(int i=0;i<n;i++) bb[0].push_back(b[i]),aa[0].push_back(a[i]);
    int ans = 0;
    for(int i=29;i>=0;i--)
    {
        bool f = 1;
        for(int j=0;j<bb.size();j++)//首先看这一位是否能完成匹配
        {
            int cnt[2] = {0};
            for(auto x:bb[j]) cnt[x>>i&1]++;
            for(auto x:aa[j]) cnt[(x>>i&1)^1]--;
            if(cnt[0]||cnt[1]) 
            {
                f = 0;
                break;
            }
        }
        if(!f) continue;//若不能完成匹配,则对分组无影响,则直接继续。
        ans|=1<<i;
        vector<vector<int>> nb,na;//将新的分组求出来
        for(int j=0;j<bb.size();j++)
        {
            vector<int> v1[2],v2[2];//对于当前组,将其按照当前位拆分为更细的1,0组
            for(auto x:bb[j]) v1[x>>i&1].push_back(x);
            for(auto x:aa[j]) v2[(x>>i&1)^1].push_back(x);//a中当前位是1,则需要存到相反的0组,是0的存到1组。因为匹配的时候是与相反的位匹配。
            for(int k=0;k<2;k++)
                if(v1[k].size())
                {
                    nb.push_back(v1[k]);
                    na.push_back(v2[k]);
                }
        }
        bb.swap(nb),aa.swap(na);
    }
    cout<<ans<<'\n';
}
 
int main() 
{
    ios;
    int T=1;
    cin>>T;
 
    while(T -- ) {
        solve();
    }
 
    return 0;
}

E. Prefix Function Queries

题目大意

给出一个初始字符串,每次加入长度不超过10的串,要求增加部分的ne数组,每次求完之后把新加入的字符删除。

分析

首先每次加入,我们都求一个kmp是不太合理的。因此考虑可持久化kmp。然后,就差不多了。

#include <bits/stdc++.h>
#define fi first    
#define se second    
#define endl '\n'
#define ios ios::sync_with_stdio(false); cin.tie(0), cout.tie(0)
typedef long long LL;
using namespace std;
const int N = 2e6 + 10,M = N*2;

int ne[N],pre[N],last;
char s[N],t[N];

void add(char x)
{
    int j = last;
    while (j && s[ne[j] + 1] != x) j = pre[j];
    s[++last] = x, j = ne[j] + 1;
    if (last == 1) ne[1] = pre[1] = 0;
    else if (s[j] == x) {
        ne[last] = j;
        if (s[ne[j] + 1] == s[j + 1]) pre[last] = pre[j];
        else pre[last] = j;
    }
    else ne[last] = pre[last] = 0;
}

void solve() 
{
    cin>>t;int len = strlen(t);
    // cout<<t<<endl;
    for(int i=0;i<len;i++) add(t[i]);
    int q;cin>>q;
    while(q--)
    {
        cin>>t;
        len = strlen(t);
        for(int i=0;i<len;i++) add(t[i]),cout<<ne[last]<<' ';
        cout<<"\n";
        last-=len;
    }
}
 
int main() 
{
    ios;
    int T=1;
    // cin>>T;
 
    while(T -- ) {
        solve();
    }
 
    return 0;
}

标签:pre,Educational,Rated,last,int,Codeforces,ne,--,define
From: https://www.cnblogs.com/aitejiu/p/16632372.html

相关文章

  • Codeforces Round #816 (Div. 2)/CodeForces1715
    CodeForces1715Crossmarket解析:题目大意有一个\(n\timesm\)的空间,Stanley需要从左上角到右下角;Megan则需要从左下角到右上角。两人可以耗费\(1\)能量到达相邻......
  • 学习随笔——codeforces题目Build Permutation解答
    摘要:本题属于构造算法,虽然简单但对思维提升有一定帮助题目原地址如下:https://codeforces.com/problemset/problem/1713/C题目截图如下:  关键词:构造算法,动态规划,*120......
  • Codeforces Round #813 (Div. 2) A - E2
    A:一组长度为n的排列,问交换多少次,能让前m个数变成[1,m]中的数输出前m个数中有多少个比m大的就可以了//-------------------------代码----------------------------......
  • codeforces round #815 (div.2) B. Interesting Sum
    一开始的想法是n^2时间暴力枚举片段的开头和结尾,但是时间肯定不行。所以干脆想办法缩减时间,用个priority_queue呀,甚至尝试着动态规划。但是很显然无论如何这种东西没法dp,完......
  • Codeforces Round #814 (Div. 2) A-D2
    A:ChipGame题意:只能向上走和向右走,走到右上角,最后一步谁操作谁就赢只要判断总步数的奇偶性就可以了//-------------------------代码----------------------------......
  • Codeforces Round #779 D
    D1我们先来看D1啊我最开始理解的就是一个翻转但是只在0开始时才是正确的这里就有一组hack1203他会输出0而不是3为啥???这样一想好像是正确的每次要是01数字不同......
  • Educational Codeforces Round 106 (Rated for Div. 2) | CF1499
    E一个暴力是显然的,\(f(i,j,k)\)表示当前已经使用\(a\)的前\(i\)位,\(b\)的前\(j\)位,最后一位是\(a\)还是\(b\)的。然后\(O(n^2)\)枚举起点跑下去即可。为啥......
  • Codeforces Round #770 (Div. 2)
    CodeforcesRound#770(Div.2)VPABCDE7min30min63min131min+2+2排名:rk485基准分:\(\color{Purple}{1967}\)A\(\color{Gray}{800}\)CF1......
  • Codeforces Round #772 (Div. 2)
    CodeforcesRound#772(Div.2)VPABC3min12min52min+4排名:rk3893基准分:\(\color{ForestGreen}{1362}\)从天选到天崩A\(\color{Gray}{800}\)......
  • Codeforces Round #815 (Div. 2)
    https://codeforces.ml/contest/1720A:思维fst了。。分数,分子分母改变多少次,变一样题意:给a/b,c/d两个分数,问分子父母各乘多少次可以得到相同的数思路很简单,将所有数......