A. 小 B 的异或
小 B 收到了一串数字,其中包含 nn 个数字。
寄件人想知道这 nn 个数的异或结果,但小 B 并不会求,就把这个问题转交给你。
但他为了使你求得的更方便,于是运用魔法把这 nn 个数都变成了 11 。
现在,你需要求出这 nn 个 11 异或后的结果。
关于异或:
- 下表为 aa 与 bb 的异或结果:
aa | bb | a \oplus ba⊕b |
---|---|---|
11 | 00 | 11 |
11 | 11 | 00 |
00 | 00 | 00 |
00 | 11 | 11 |
- 如果你还是不明白,可以在程序中使用
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 的全相邻字符串
定义全相邻字符串满足如下两个条件:
-
由 nn 个大写或小写字母组成 (n \geq 1)(n≥1)
-
字符串中所有相邻的两个字母在字典中也是相邻的,特别要说明的是,不考虑大小写,且 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;
}