• 字典树解法(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)的更多相关文章

  1. HDU - 1251 统计难题(trie树)

    Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).  Input输入数据的第一部 ...

  2. hdu 1251 统计难题(trie树入门)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  3. hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)

    统计难题Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submis ...

  4. hdu 1251 统计难题 (字典树入门题)

    /******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...

  5. hdu 1251 统计难题 trie入门

    统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...

  6. HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)

    Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...

  7. HDU 1251 统计难题(Trie)

    统计难题 [题目链接]统计难题 [题目类型]Trie &题解: Trie的模板题,只不过这题坑点在没给数据范围,改成5e5就可以过了,用的刘汝佳蓝书模板 &代码: #include & ...

  8. hdu 1251 统计难题 字典树第一题。

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submi ...

  9. hdu 1251 统计难题(字典树)

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

随机推荐

  1. 吴裕雄--天生自然 JAVASCRIPT开发学习: DOM - 改变 HTML

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 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 ...

  3. Odd sum (对本菜鸡来说是个极坑题)

    https://codeforces.com/problemset/problem/797/B time limit per test 1 second memory limit per test 2 ...

  4. [Java-基础] 什么是ORM

    ORM简介 ORM:对象关系映射:Object Relational Mapping 用于实现面向对象编程语言里不同类型系统的数据之间的转换 ​ 一般的,数据库绝大部分是面向关系的数据库,但是写代码的 ...

  5. SeetaFaceEngine系列1:Face Detection编译和使用

    SeetaFace,根据GitHub上的介绍,就是一个开源的人脸检测.矫正和识别的开源库,是采用C++来编写的,并且是在CPU上执行的,没有用到GPU,但是可以用SSE或者OpenMP来加速.整个库分 ...

  6. uWSGI调整buffer-size

    https://uwsgi-docs.readthedocs.io/en/latest/Options.html#buffer-size buffer-size argument: required_ ...

  7. F5 BIG-IPLTM单臂组网的三种连接模式

  8. [Algo] 132. Deep Copy Undirected Graph

    Make a deep copy of an undirected graph, there could be cycles in the original graph. Assumptions Th ...

  9. linux的/dev内容介绍

    http://www.cnblogs.com/lidabo/p/4505360.html 这个结合那个linux的终端介绍 https://zhidao.baidu.com/question/1742 ...

  10. ubuntu19.10 相关软件安装

    1.Typora Typora是一款Markdown撰写软件,Linux版本也相当好用. Typora的安装方式如下: # or run: # sudo apt-key adv --keyserver ...