D22-读论文D22&算法D22

841字符串哈希

用p数组储存进制信息
用s数组储存字符串哈希相关信息
用getHash获取字符串中某一段的哈希值

n,m  = map(int, input().split())
string = ' '+ str(input())
N = 100010
P,Q = 131, 2**64
p,s = [0]*N, [0]*N

p[0] = 1
for i in range(1, 1+n):
    # p用来计算p的n次方,%Q以免溢出
    p[i] = p[i-1]*P%Q
    # s用来储存长度为i的字符串的哈希值
    s[i] = (s[i-1]*P + ord(string[i]))%Q


def getHash(l,r):
    return (s[r]-s[l-1]*p[r-l+1])%Q

for _ in range(m):
    l1, r1, l2, r2 = map(int,input().split())
    if getHash(l1,r1)==getHash(l2,r2):
        print('Yes')
    else:
        print('No')
    

840模拟散列表

n = int(input())

N = 100010
null = 0x3f3f3f3f
s = [null]*N
# find返回的要不然是空值,要不然是x已经存在;
# 对于插入,都直接放入即可;对于判断是否出现过,则判断该位置的值是否为x。
def find(x):
    k = x%N
    while s[k]!=null and s[k]!=x:
        k += 1
        if k==N:
            k=0
    return k

for _ in range(n):
    op, pt = input().split()
    x = int(pt)
    if op=='I':
        s[find(x)] = x
    else:
        if s[find(x)]==x:
            print('Yes')
        else:
            print('No')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值