牛客小白月赛128(ABC题)
A.模糊匹配
链接:https://ac.nowcoder.com/acm/contest/127265/A
题目描述:
车牌号、注册码、序列号等字符串通常包含阿拉伯数字和大小写不一的拉丁字母。人们手工录入这些字符串时,常常会出错,比如混淆大写字母 “O” 和数字 “0”,或者混淆大写字母 “I”、小写字母 “l” 和数字 “1”。你需要判断长度相等的两个字符串s1和s2是否相同,但要忽略以上由手工录入带来的错误。换句话说,你应当认为 “O”、“0” 相同,“I”、“l”、“1” 相同。
输入描述:
每个测试文件均包含多组测试数据。第一行输入一个整数 TTT(1≤T≤10^3)代表数据组数,每组测试数据描述如下:
第一行输入一个整数 n(1≤n≤100),表示字符串s1和s2的长度。
第二行输入一个长度为 n,仅包含拉丁字母和阿拉伯数字的字符串s1。
第三行输入一个长度为 n,仅包含拉丁字母和阿拉伯数字的字符串s2。
输出描述:
对于每一组测试数据,新起一行。如果字符串s1和s2相同,则在一行中输出 “YES”(不含引号);否则,输出 “NO”(不含引号)。 你可以输出 “YES” 或 “NO” 的任意大小写形式。例如,字符串 “yEs”、“yes”、“Yes”、“YES” 都视为肯定回答。另外,为了契合本题风格,字符串 “N0”、“n0” 也视为和 “NO” 一样的否定回答。
代码:
def demo():
n=int(input())
s1=input()
s2=input()
s1=s1.replace("0","O");
s1=s1.replace("l","I")
s1=s1.replace("1","I")
s2=s2.replace("0","O");
s2=s2.replace("l","I")
s2=s2.replace("1","I")
if s1==s2:
return "YES"
else:
return "NO"
t=int(input())
while t:
t-=1
print(demo())
B.只留专一数
题目描述:
Zaoly 给了你一个长度为 n 的正整数数列 a 和一个正整数 n′。初始时,n′=n,a=[a1,a2,…,an]。你需要对数列 a 不断进行变换,每次变换需按顺序进行以下步骤,直到 n′=1 为止:
第一步,选择两个整数 i 和 j(1≤i,j≤n′,i=j);
第二步,令 ai:=aiaj(ai 的值变为 ai 的 aj 次方);
第三步,令 aj:=an′;
第四步,令 n′:=n′−1。
请你告诉 Zaoly,是否存在一种变换方法,使得在所有变换完成后,a1 是专一数?
一个正整数,如果其不同质因数⁽¹⁾的个数不超过 1 个,则这个数是专一数;否则,这个数不是专一数。例如,1、3、125 是专一数,但 6、30、900 不是专一数。
【名词解释】
质因数⁽¹⁾:也称质因子。对于正整数 x,如果存在质数⁽²⁾ p 使得 x 能被 p 整除,则称 p 是 x 的质因子。例如,12 的质因子有 2 和 3。
质数⁽²⁾:一个大于 1 的正整数,如果除了 1 和它自身以外不再有其他因数,那么这个数被称作质数。特殊地,1 既不是质数也不是合数。
输入描述:
每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤2⋅10^4)代表数据组数,每组测试数据描述如下:第一行输入一个整数 n(1≤n≤2⋅10^5),表示数列的长度。第二行输入用空格隔开的 n 个整数 a1,a2,…,an(1≤ai≤10^3),表示数列的元素。除此之外,保证单个测试文件的 n 之和不超过 2⋅10^5。
输出描述:
对于每一组测试数据,新起一行。如果存在这样的变换方法,输出 "YES"(不含引号);否则输出 "NO"(不含引号)。你可以输出 "YES" 或 "NO" 的任意大小写形式。例如,字符串 "yEs"、"yes"、"Yes"、"YES" 都视为肯定回答。
代码:
import sys
def demo(x):
if x==1:
return True
sSet=set()
i=2
while i*i<=x:
while x%i==0:
sSet.add(i)
x=x//i
i+=1
if x>1:
sSet.add(x)
return len(sSet) <= 1
input_data=sys.stdin.read().split()
ptr=0
t=int(input_data[ptr])
ptr+=1
while t:
t-=1
n=int(input_data[ptr])
ptr+=1
a=list(map(int,input_data[ptr:ptr + n]))
ptr+=n
if n==1:
print("YES" if demo(a[0]) else "NO")
else:
flag=False
for num in a:
if demo(num):
flag=True
break
print("YES" if flag else "NO")
C.左右左右左,左右左左右左右
题目描述:
0-1 字符串,指每个字符都为 “0” 或 “1” 的字符串。
每个长度为 n 的 0-1 字符串 s=s1s2…sn,都拥有一个长度为 n 的左右差数列 d1,d2,…,dn,定义为:di=∣a0⋅pc(i,1)−a1⋅pc(i,0)∣其中 pc(i,j) 表示字符串 s1s2…si 中字符 j 出现的次数。注意,其中 a0 是字符 “1” 的系数,a1 是字符 “0” 的系数。
请你从所有长度为 n 的 0-1 字符串中,找出一个字符串 s,其拥有字典序最小的左右差数列。如果有多种答案,你可以任选一种。
【名词解释】
数列的字典序比较:从左到右逐个比较两个数列的元素。如果在某个位置上元素不同,比较这两个元素的大小,元素小的数列字典序也小。如果一直比较到其中一个数列结束,则长度较短的数列字典序更小。
更具体地:对于长度都为 n 的两个数列 [d1,1,d1,2,…,d1,n] 和 [d2,1,d2,2,…,d2,n],如果存在整数 i(1≤i≤n),使得 d1,1=d2,1,d1,2=d2,2,…,d1,i−1=d2,i−1,但 d1,i 输入描述: 每个测试文件均包含多组测试数据。第一行输入一个整数 T(1≤T≤5⋅10^4)代表数据组数,每组测试数据描述如下: 在一行上输入用空格隔开的三个整数 、、(1≤n≤2⋅10^5;0≤a0,a1≤2⋅10^5),表示字符串的长度、字符 1 的系数、字符 0 的系数。 除此之外,保证单个测试文件的 n 值之和不超过 2⋅10^5。 输出描述: 对于每一组测试数据,新起一行输出一个长度为 n 的 0-1 字符串 s,表示答案。 如果存在多个解决方案,你可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。 代码:
def demo():
n,a0,a1=map(int,input().split())
s=0
for i in range(n):
if abs(s-a1)<=abs(s+a0):
print("0",end="")
s-=a1
else:
print("1",end="")
s+=a0
print()
t=int(input())
while t:
t-=1
demo()








