HDU-1251-统计难题(Trie树)(BST)(AVL)
- 字典树解法(Trie树)
Accepted 1251 156MS 45400K 949 B C++ #include"iostream"
#include"cstdlib"
#include"cstring"
#include"cstdio"
using namespace std;
struct tree {
int cnt;
tree* Next[];
} *root;
tree* init() {
tree* t = (tree*) malloc(sizeof(tree));
memset(t -> Next, NULL, sizeof(t -> Next));
t -> cnt = ;
return t;
}
void in(char* s) {
tree* now = root;
for(int i = ; s[i]; i++) {
int j = s[i] - 'a';
if(! now -> Next[j])
now -> Next[j] = init();
now = now -> Next[j];
now -> cnt++;
}
}
void out(char* s) {
tree* now = root;
for(int i = ; s[i]; i++) {
int j = s[i] - 'a';
if(!now -> Next[j]) {
puts("");
return;
}
now = now -> Next[j];
}
printf("%d\n", now -> cnt);
}
char s[];
int main() {
root = init();
while(gets(s) && s[])
in(s);
while(gets(s))
out(s);
return ;
}
- 二叉搜索树解法(BST)
Accepted 1251 358MS 18864K 1443B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
struct BST {
char key[];
int value;
BST* lson;
BST* rson;
}*root;
char s[];
BST* init() {
BST* point = (BST*)malloc(sizeof(BST));
strcpy(point->key, s);
point->value = ;
point->lson = point->rson = NULL;
return point;
}
void insert() {
BST* father = NULL;
BST* now = root;
int cmp;
while (now != NULL) {
cmp = strcmp(now->key, s);
if (cmp == ) {
now->value++;
return;
} else if (cmp == -) {
father = now;
now = now->rson;
} else {
father = now;
now = now->lson;
}
}
if (father == NULL) {
root = init();
} else if (cmp == -) {
father->rson = init();
} else {
father->lson = init();
}
}
int query() {
BST* now = root;
while (now != NULL) {
int cmp = strcmp(now->key, s);
if (cmp == ) {
return now->value;
} else if (cmp == -) {
now = now->rson;
} else {
now = now->lson;
}
}
return ;
}
int main() {
while (gets(s) && s[]) {
int len = strlen(s);
while (len != ) {
s[len--] = '\0';
insert();
}
}
while (~scanf("%s", &s)) {
printf("%d\n", query());
}
return ;
} - 平衡二叉搜索树解法(AVL)
Accepted 1251 343MS 24648K 3885B G++ #include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
struct AVL {
char key[];
int value;
int height;
AVL* father;
AVL* lson;
AVL* rson;
}*root;
AVL* fafa;
AVL* fa;
AVL* me;
char key[];
AVL* init(AVL* fa) {
AVL* point = (AVL*)malloc(sizeof(AVL));
strcpy(point->key, key);
point->value = ;
point->father = fa;
point->height = ;
point->lson = point->rson = NULL;
return point;
}
void updateHeight(AVL* point) {
int lheight = point->lson == NULL ? : point->lson->height;
int rheight = point->rson == NULL ? : point->rson->height;
point->height = max(lheight, rheight) + ;
if (point->father != NULL) {
updateHeight(point->father);
}
}
bool unbalance(AVL* point) {
me = point;
fa = point->father;
fafa = fa->father;
if (fafa == NULL) {
return false;
}
int lheight = fafa->lson == NULL ? : fafa->lson->height;
int rheight = fafa->rson == NULL ? : fafa->rson->height;
if (abs(lheight - rheight) > ) {
return true;
}
return unbalance(fa);
}
void leftRotate(AVL* fa, AVL* me) {
AVL* fafa = fa->father;
me->father = fafa;
if (fafa != NULL) {
if (fafa->lson == fa) {
fafa->lson = me;
} else {
fafa->rson = me;
}
}
fa->rson = me->lson;
if (me->lson != NULL) {
me->lson->father = fa;
}
fa->father = me;
me->lson = fa;
updateHeight(fa);
}
void rightRotate(AVL* fa, AVL* me) {
AVL* fafa = fa->father;
me->father = fafa;
if (fafa != NULL) {
if (fafa->lson == fa) {
fafa->lson = me;
} else {
fafa->rson = me;
}
}
fa->lson = me->rson;
if (me->rson != NULL) {
me->rson->father = fa;
}
fa->father = me;
me->rson = fa;
updateHeight(fa);
}
void rebalance() {
if (fafa->lson == fa && fa->lson == me) {
rightRotate(fafa, fa);
return;
}
if (fafa->rson == fa && fa->rson == me) {
leftRotate(fafa, fa);
return;
}
if (fafa->lson == fa && fa->rson == me) {
leftRotate(fa, me);
rightRotate(fafa, me);
return;
}
rightRotate(fa, me);
leftRotate(fafa, me);
}
void insert() {
AVL* father = NULL;
AVL* now = root;
int cmp;
while (now != NULL) {
if (strcmp(now->key, key) == ) {
now->value++;
return;
}
father = now;
cmp = strcmp(now->key, key);
if (cmp == -) {
now = now->rson;
} else {
now = now->lson;
}
}
if (father == NULL) {
root = init(NULL);
return;
} else if (cmp == -) {
father->rson = init(father);
updateHeight(father);
if (unbalance(father->rson)) {
rebalance();
}
} else {
father->lson = init(father);
updateHeight(father);
if (unbalance(father->lson)) {
rebalance();
}
}
}
int query() {
AVL* now = root;
while (now != NULL) {
int cmp = strcmp(now->key, key);
if (cmp == ) {
return now->value;
} else if (cmp == -) {
now = now->rson;
} else {
now = now->lson;
}
}
return ;
}
int main() {
while (gets(key) && key[]) {
int len = strlen(key);
while (len != ) {
key[len--] = '\0';
insert();
if (root->father != NULL) {
root = root->father;
}
}
}
while (~scanf("%s", key)) {
printf("%d\n", query());
}
return ;
}
HDU-1251-统计难题(Trie树)(BST)(AVL)的更多相关文章
- HDU - 1251 统计难题(trie树)
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input输入数据的第一部 ...
- hdu 1251 统计难题(trie树入门)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)
统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submis ...
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- hdu 1251 统计难题 trie入门
统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...
- HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...
- HDU 1251 统计难题(Trie)
统计难题 [题目链接]统计难题 [题目类型]Trie &题解: Trie的模板题,只不过这题坑点在没给数据范围,改成5e5就可以过了,用的刘汝佳蓝书模板 &代码: #include & ...
- hdu 1251 统计难题 字典树第一题。
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- hdu 1251 统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
随机推荐
- 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM - 改变 HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- PAT Advanced 1094 The Largest Generation (25) [BFS,DFS,树的遍历]
题目 A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level ...
- Odd sum (对本菜鸡来说是个极坑题)
https://codeforces.com/problemset/problem/797/B time limit per test 1 second memory limit per test 2 ...
- [Java-基础] 什么是ORM
ORM简介 ORM:对象关系映射:Object Relational Mapping 用于实现面向对象编程语言里不同类型系统的数据之间的转换 一般的,数据库绝大部分是面向关系的数据库,但是写代码的 ...
- SeetaFaceEngine系列1:Face Detection编译和使用
SeetaFace,根据GitHub上的介绍,就是一个开源的人脸检测.矫正和识别的开源库,是采用C++来编写的,并且是在CPU上执行的,没有用到GPU,但是可以用SSE或者OpenMP来加速.整个库分 ...
- uWSGI调整buffer-size
https://uwsgi-docs.readthedocs.io/en/latest/Options.html#buffer-size buffer-size argument: required_ ...
- F5 BIG-IPLTM单臂组网的三种连接模式
- [Algo] 132. Deep Copy Undirected Graph
Make a deep copy of an undirected graph, there could be cycles in the original graph. Assumptions Th ...
- linux的/dev内容介绍
http://www.cnblogs.com/lidabo/p/4505360.html 这个结合那个linux的终端介绍 https://zhidao.baidu.com/question/1742 ...
- ubuntu19.10 相关软件安装
1.Typora Typora是一款Markdown撰写软件,Linux版本也相当好用. Typora的安装方式如下: # or run: # sudo apt-key adv --keyserver ...