没错,因为太弱了, 从图论回归数据结构
另外有人能教一下孩子怎么插入图片吗?QAQ
// Trie 字典树 前缀树 是一种树形数据结构
// 用处: 用来快速存储和查找字符串集合的一种数据结构
// 存储
// 一个一个字符串开始存储 , 一个一个字符遍历 , 有这个字符就往下走,没有就创建
// 并在存最后一个字符时,打上标记 ,证明有个字符串以这个字符结尾
// 查找
// 从根节点出发,开始找
// 以小写字母为例
int son[N][26] , cnt[N] , idx ;
// 下标为零的点为空的节点
/*
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
0
1
2
3
4
5
6
7
8
9
10
.
.
.
N
*/
// 存储
void insert(char st[])
{
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] ++ ;
}
// 为什么要son[p][u] = ++ idx;
// 这里面son[N][26]如最上面的图
// 我们要注意一件事 , 每个节点的子节点都有26种可能
// 所以再创建完一个节点之后 , 我们要++ idx
// 让他蹦到下一层, 从某种角度来说就是 , 新开辟一层26个的空间
// 或者说这是一个单链表 , 这个son[p][u] 存的是下一个字符所在的层
// 由于第二维开了26个 ,也就间接地存下了字母所在的位置
// 查找操作
比如查找一个字符串是否存在
bool find(char op[])
{
int p = 0 ;
for (int i = 0 ; str[i] ; i ++ )
{
int u = str[i] - 'a' ;
if (!son[p][u]) return false ;
p = son[p][u];
}
if (cnt[p] != 0 ) return 1 ;
else return 0 ;
}
// 并查集是一种树形结构
// 每个元素都有一个祖先,也就是根节点(树形结构)
// 初始化时,元素的祖先就是自己
// 元素是 i
for (int i = 1 ; i <= n ; i ++ ) p[i] = i ;
// 下标是 i 也是元素
// p[i]存储的是i元素所在小树的根 , 也可以是祖先
// 一个关键操作
// 找到元素 x 的公共祖先公共祖先
int find(int x)
{
// 这里的判断条件 由于根节点的祖先是他自己 ,所以才有了这个判断条件
if (p[x] != x) p[x] = find(p[x);
return p[x] ;
} // 这里还有一个绝妙的地方就是递归时会直接把子节点的祖先重置为树根
// 一个关键操作
// 合并两个元素 a 与 b 所在的集合
p[find(a)] = find(b)
// 把a的祖先合并到b的祖先上 , 或者b 合在 a 上
不会搞,那个链接不会搞,QaQ