先复习一下数据结构
考察 T r i e Trie Trie算法的题目通常会限制:字符串只有小写英文字母或者大写英文字母,且字母通常为 26 26 26或 52 52 52个
trie树可以保证在 O ( n ) O(n) O(n)的时间复杂度下储存和查找字符串
字典树的数组实现方式:
开两个数组:cnt[N], son[N][26]
,分别用来存储:以某个节点结尾的字符串的数量 和 某一个节点的所有子节点
插入操作:
#include<bits/stdc++.h>
using namespace std;
const int N = 10100;
int cnt[N], son[N][26], idx;
void insert(char str[]){
int p = 0;
for (int i = 0; str[i]; i ++ ){
int u = str[i] - 'a';
if (!son[u][p]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p] ++ ;
}
注解: 这里的idx
并不会更新为
0
0
0,综上,不同的节点上的idx
都是不一样的
还要将字符串上的每一个字符都映射到
0
−
25
0-25
0−25之间的数字,便于利用下标储存
只有一直沿着同一条路走才有相同的son[][]
,在路上出现分支时,那么在分支往后的地方所有的值都不一样,这就是用数组模拟的成功之处。
查询操作和插入操作一样
例题:
T
r
i
e
字
符
串
统
计
Trie字符串统计
Trie字符串统计
代
码
:
代码:
代码:
#include<iostream>
using namespace std;
const int N = 100010;
int son[N][26], cnt[N], idx;
char str[N];
void insert(char str[]) {
int p = 0;
for (int i = 0; str[i]; i++) {
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
cnt[p] ++;
}
int query(char str[]) {
int p = 0;
for (int i = 0; str[i]; i++) {
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}
int main() {
int n;
cin >> n;
while (n--) {
char op[2];
cin >> op >> str;
if (op[0] == 'I') insert(str);
else cout << query(str) << endl;
}
}
P y g a m e − L e a r n i n g Pygame-Learning Pygame−Learning
理解 精灵 和 精灵组
在之前我写的图像加载、位置变化、绘制图像 都需要自己编写代码分别处理
但是为了简化开发步骤,pygame 提供了两个类:
pygame.sprite.Sprite()
和pygame.sprite.Group
游戏框架大概如下图所示:
其中第一个用于储存图像数据 i m a g e image image和图像位置信息 R e c t Rect Rect的对象
在游戏开发中,通常把 显示图像的对象 叫做精灵( Sprite
)
精灵组
一个精灵组可以包含多个精灵对象
1.调用 精灵组 对象的 update()
方法
2.可以 自动调用 组内每一个精灵的update()
方法
调用 精灵组 对象的 draw(屏幕对象) 方法
可以将 组内每一个精灵 的 image 绘制在 rect 位置
import pygame
class GameSprite(pygame.sprite.Sprite):
"""游戏精灵基类"""
def __init__(self, image_name, speed=1):
# 调用父类的初始化方法
super().__init__()
# 加载图像
self.image = pygame.image.load(image_name)
# 设置尺寸
self.rect = self.image.get_rect()
# 记录速度
self.speed = speed
def update(self, *args):
# 默认在垂直方向移动
self.rect.y += self.speed
目的就是简化操作,因为调用精灵对象使代码效率大大增加
目前的 p y g a m e pygame pygame的最基本的操作已经基本学习完了,但是 P y t h o n Python Python基本功不够扎实导致 P y g a m e Pygame Pygame的进阶操作无法学习,所以从现在开始夯实基础知识