蓝桥杯 第三十三天

目录

1.trie树

2.143. 最大异或对 - AcWing题库

3.836. 合并集合 - AcWing题库

4.连通块中的数量

5.240. 食物链 - AcWing题库


1.trie树

N=10
son=[[0 for i in range(26)]for j in range(N)]
cnt=[0 for i in range(N)]
idx=0
str=""

def insert(string):
    global idx
    p=0
    for i in range(len(string)):
        u=ord(string[i])-ord('a')
        if not son[p][u]:
            idx+=1
            son[p][u]=idx
        p=son[p][u]
    cnt[p]+=1

def query(string):
    p=0
    for i in range(len(string)):
        u=ord(string[i])-ord('a')
        if not son[p][u]:
            return 0
        p=son[p][u]
    return cnt[p]

n=int(input())
for i in range(n):
    op,string=input().split()
    if op=='I':
        insert(string)
    else:
        print(query(string))

# 5
# I abc
# Q abc
# Q ab
# I ab
# Q ab

2.143. 最大异或对 - AcWing题库

N=35
son=[[0 for i in range(2)]for j in range(N)]
idx=0
def insert(value):
    global idx
    p=0
    for i in range(30,-1,-1):
        u=value>>i&1
        if not son[p][u]:
            idx+=1
            son[p][u]=idx
        p=son[p][u]
    return
def search(value):
    p=0
    result=0
    for i in range(30,-1,-1):
        u=value>>i&1
        if son[p][not u]:
            result+=1<<i
            p=son[p][not u]
        else:
            p=son[p][u]
    return result
n=int(input())
a=list(map(int,input().split()))
for i in a:
    insert(i)
ans=0
for i in a:
    ans=max(ans,search(i))
print(ans)

3.836. 合并集合 - AcWing题库

N=100010
fa=[i for i in range(N)]
n,m=map(int,input().split())
def find(x):
    if fa[x]!=x:
        fa[x]=find(fa[x])
    return fa[x]
for _ in range(m):
    op,a,b=input().split()
    a,b=int(a),int(b)
    if op=='M':
        fa[find(a)]=find(b)
    else:
        if find(a)==find(b):
            print("Yes")
        else:
            print("No")

4.连通块中的数量

n,m=map(int,input().split())
fa=[i for i in range(n+2)]
s=[1 for i in range(n+2)]
def find(x):
    if fa[x]!=x:
        fa[x]=find(fa[x])
    return fa[x]
for i in range(m):
    list=input().split()
    if list[0]=='C':
        a,b=map(int,list[1:])
        if find(a)==find(b):
            continue
        fa[find(a)]=find(b)
        s[b]+=s[a]
    elif list[0]=="Q1":
        a,b=map(int,list[1:])
        if find(a)==find(b):
            print("Yes")
        else:
            print("No")
    else:
        a=int(list[1])
        print(s[find(a)])

5.240. 食物链 - AcWing题库

N=50010
fa=[i for i in range(N)]
d=[0 for i in range(N)]
def find(x):
    if fa[x]!=x:
        q=find(fa[x])
        d[x]+=d[fa[x]]
        fa[x]=q
    return fa[x]

n,m=map(int,input().split())
res=0
for _ in range(m):
    t,x,y=map(int,input().split())
    if x>n or y>n:
        res+=1
        continue
    else:
        fax=find(x)
        fay=find(y)
        if t==1:
            if fax==fay and (d[x]-d[y])%3:
                res+=1
            elif fax!=fay:
                fa[fax]=fay
                d[fax]=d[y]-d[x]
        else:
            if fax==fay and (d[x]-d[y]-1)%3:
                res+=1
            elif fax!=fay:
                fa[fax]=fay
                d[fax]=d[y]+1-d[x]
print(res)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值