思维入门1

A. 小 B 的异或

小 B 收到了一串数字,其中包含 nn 个数字。

寄件人想知道这 nn 个数的异或结果,但小 B 并不会求,就把这个问题转交给你。

但他为了使你求得的更方便,于是运用魔法把这 nn 个数都变成了 11 。

现在,你需要求出这 nn 个 11 异或后的结果。

关于异或:

  • 下表为 aa 与 bb 的异或结果:
aabba \oplus ba⊕b
110011
111100
000000
001111
  • 如果你还是不明白,可以在程序中使用a^b来查看 aa 和 bb 异或的结果。
  • 再不明白可在互联网上搜索相关知识。

输入格式

一行一个整数 nn。

输出格式

一行一个整数,为答案。

数据范围

对于 30\%30% 的数据,1 \leq n \leq 10^61≤n≤106。

对于 50\%50% 的数据,1 \leq n \leq 10^91≤n≤109。

对于 100\%100% 的数据,1 \leq n \leq 10^{18}1≤n≤1018。

输出时每行末尾的多余空格,不影响答案正确性

样例输入1复制

2

样例输出1复制

0

样例解释1

两个 11 异或,查表可知结果为 00。

样例输入2复制

3

样例输出2复制

1

样例解释2

三个 11 异或,结果为 11,可手动在程序中计算出答案。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    cin>>n;
    if(n%2)
        cout<<1<<endl;
    else
        cout<<0<<endl;
}

B. 小 B 找数

小 B 给你两个整数,请你求出两个数当中的公有数字。

  • 公有数字是指某个数字在两个整数中都出现过。

只要你的程序在 1s1s 内找到结果,他就可以用这些数字给你变个魔术看。

输入格式

一行两个整数。

输出格式

一行几个数字,表示公有的数字,数字间用空格隔开。

输出需按照数字大小由小到大输出。

如果不存在,则输出 -1

数据范围

设两个数字中较大的为 nn:

对于 50\%50% 的数据,0 \leq n \leq 10^90≤n≤109。

对于 80\%80% 的数据,0 \leq n \leq 10^{18}0≤n≤1018。

对于 90\%90% 的数据,0 \leq n \leq 10^{10^4}0≤n≤10104。

对于 100\%100% 的数据,0 \leq n \leq 10^{10^6}0≤n≤10106。

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制

321556 234

样例输出复制

2 3

样例解释

22 和 33 在两个整数中都出现过,其他数字均不满足。

#include <bits/stdc++.h>
using namespace std;
int mp[10];
char s1[1000005],s2[1000005];
int main()
{
    cin>>s1>>s2;
    int n=strlen(s1);
    int m=strlen(s2);
    for(int i=0;i<n;i++)
    {
        mp[s1[i]-'0']=1;
    }
    for(int i=0;i<m;i++)
    {
        if(mp[s2[i]-'0']==1)
            mp[s2[i]-'0']=2;
    }
    int flag=0;
    for(int i=0;i<=9;i++)
    {
        if(mp[i]==2)
        {
            flag=1;
            cout<<i<<" ";
        }
    }
    if(flag==0)
        cout<<-1<<endl;
}

C. 小 B 的全相邻字符串

定义全相邻字符串满足如下两个条件:

  1. 由 nn 个大写或小写字母组成 (n \geq 1)(n≥1)

  2. 字符串中所有相邻的两个字母在字典中也是相邻的,特别要说明的是,不考虑大小写,且 aa 与 zz 也算相邻。

例如:ABcdE 就是一串全相邻字符串。

现在小 B 给你一串字符串,请你找出这串字符串中最长的全相邻子串。

输入格式

第一行一个整数 TT,表示有 TT 组数据。

接下来的 TT 行,每行一个字符串,表示待处理字符串。

保证字符串仅含大小写字母。

输出格式

共 TT 行,每行一个字符串,表示最长全相邻子串。(若有多个最长全相邻子串,输出最先出现的)

数据范围

对于 10\%10% 的数据,1 \leq T \leq 101≤T≤10, 每个字符串的长度不大于 1010 。

对于 30\%30% 的数据,1 \leq T \leq 101≤T≤10, 每个字符串的长度不大于 100100 。

对于 100\%100% 的数据,1 \leq T \leq 10^31≤T≤103, 每个字符串的长度不大于 10^4104 。

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制

1
ABcdEqaq

样例输出复制

ABcdE

样例解释

这串字符串中,ABcdE是一个全相邻字符串,此外还有AB ABc Bcd等,但ABcdE为最长的答案。

#include <bits/stdc++.h>
using namespace std;
char s1[10005],s2[10005];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>s1;
        int n=strlen(s1);
        for(int i=0;i<n;i++)
        {
            if(s1[i]>='A'&&s1[i]<='Z')
                s2[i]=s1[i]+'a'-'A';
            else
                s2[i]=s1[i];
        }
        int ans1=0,ans2=0,ans=0;
        int now1=0,now2=0;
        for(int i=0;i<n;i++)
        {
            if(now2-now1+1>ans)
            {
                ans=now2-now1+1;
                ans2=now2;
                ans1=now1;
            }
            if(s2[i+1]==s2[i]+1||s2[i+1]==s2[i]-1||(s2[i]=='a'&&s2[i+1]=='z')||(s2[i]=='z'&&s2[i+1]=='a'))
                now2++;
            else
            {
                now2++;
                now1=now2;
            }
        }
        for(int i=ans1;i<ans2+1;i++)
            cout<<s1[i];
        cout<<endl;
    }
}

D. 小 B 的魔法

小 B 表演魔法。

观众给他两个 字符串 S,TS,T ,这两个字符串中只包含 小写 字母。

现在小 B 可以把两个字符串中任意所有的字母 xx 替换成 yy( x,yx,y 代表任意字母),记为一次魔法操作。

注:任意所有指的是任何一种字母,它在两个串中的所有出现的位置都可以替换成同一种字母,当然也可以替换它们中的几个。

观众想知道,将两个字符串变为全等的最少操作次数是多少?

小 B 只会变魔术,所以他想让你求出这个次数。

注:全等指对于任意的 1\le i \le n1≤i≤n,都有 S[i]=T[i]S[i]=T[i]。 (字符串坐标从 11 开始)

输入格式

第一行一个整数 nn,表示字符串的长度。

接下来的两行,每行一个长度为 nn 的字符串,即 SS 和 TT。

输出格式

一行一个整数,表示最少的操作次数。

数据范围

对于 30\%30% 的数据,1\le n\le 101≤n≤10。

对于 70\%70% 的数据,1\le n\le 10^31≤n≤103。

对于 100\%100% 的数据,1\le n\le 10^51≤n≤105。

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制

3
aab
zcb

样例输出复制

2

样例解释

首先把 z 替换为c ,然后把所有 c 替换为a

这是最短的方案之一,当然还有其他等价方案不再赘述。

#include <bits/stdc++.h>
using namespace std;
char s1[1000005],s2[1000005];
int fa[1005];
int find(int x)
{
    if(fa[x]!=x)
        fa[x]=find(fa[x]);
    return fa[x];
}
int main()
{
    for(int i=0;i<=1000;i++)
        fa[i]=i;
    int n;
    cin>>n;
    cin>>s1>>s2;
    int cnt=0;
    for(int i=0;i<n;i++)
    {
        if(s1[i]!=s2[i])
        {
            int x=find(s1[i]);
            int y=find(s2[i]);
            if(x!=y)
            {
                fa[y]=x;
                cnt++;
			}
		}
    }
    cout<<cnt<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值