单调栈
n=int(input())
a=list(map(int,input().split()))
s=[]
for i in a:
if not s:
print(-1,end=" ")
else:
while s and s[-1]>=i:
s.pop()
if not s:
print(-1,end=" ")
else:
print(s[-1],end=" ")
s.append(i)
单调队列
之前一直无法理解,这次算是弄清楚了,其实就是维护了一个单调的数据结构,可以有两种,一种是递增,一种是递减
- 不过有一说一,这一题并不是一个很好的入门题,因为这一题限制了长度,很容易弄晕初学者,如果去除长度的限制,就是一道裸的单调队列
n,m=map(int,input().split())
a=list(map(int,input().split()))
from collections import deque
q=deque([])
for i in range(n):
if q and i-q[0]+1>m:
q.popleft()
while q and a[q[-1]]>a[i]:
q.pop()
q.append(i)
if i>=m-1:
print(a[q[0]],end=" ")
q.clear()
print()
for i in range(n):
if q and i-q[0]+1>m:
q.popleft()
while q and a[q[-1]]<=a[i]:
q.pop()
q.append(i)
if i>=m-1:
print(a[q[0]],end=" ")
Trie字符串统计
这一题之前也是没理解,关键在于y总建树的方法我一直都不想去学,无法理解idx的意思
idx其实就是节点,每次加一都相当于创造一个节点出来
def insert(s):
global idx
p=0
for i in s:
num=ord(i)-ord('a')
if son[p][num]==-1:
idx+=1
son[p][num]=idx
p=son[p][num]
cnt[p]+=1
return
def query(s):
p=0
for i in s:
num=ord(i)-ord('a')
if son[p][num]==-1:
return 0
p=son[p][num]
return cnt[p]
n=int(input())
idx=0
cnt=[0 for i in range(10000)]
son=[[-1 for i in range(27)]for j in range(1000)]
for i in range(n):
x=input()
op=x[0]
s=x[2:]
if op=='I':
insert(s)
else:
print(query(s))
最大异或数 (Trie树的应用)
脑中要有一棵树的形状
def insert(num):
global idx
p=0
for k in range(32,-1,-1):
x=num>>k&1
if son[p][x]==-1:
idx+=1
son[p][x]=idx
p=son[p][x]
return
def search(num):
p=0
result=0
for k in range(32,-1,-1):
x=num>>k&1
if son[p][not x]==-1:
p=son[p][x]
else:
result+=1<<k
p=son[p][not x]
return result
N=100000
idx=0
son=[[-1 for i in range(2)]for j in range(N)]
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)