• 字典树解法(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. SQL优化——ORACLE

    SQL优化——ORACLE 索引是由Oracle维护的可选结构,为数据提供快速的访问.准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度. 当建立一个索引时,必须指定用于跟踪的表名以 ...

  2. 为什么常用 Map<> map = new HashMap()

    在初学Java的时候,经常能看到教材上的写法,使用了接口Map来引用一个map,而不是它的具体实现,那么这样做的好处是什么呢? <Effective Java>第52条:通过接口引用对象 ...

  3. 吴裕雄--天生自然Linux操作系统:Linux 系统启动过程

    linux启动时我们会看到许多启动信息. Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 . 用户登录系统. in ...

  4. Python中的encode和decode

    原文地址:http://www.cnblogs.com/tingyugetc/p/5727383.html 1.Python3中对文本和二进制数据进行了比较清晰的区分,文本总是 unicode ,由  ...

  5. TabControl+ListView

    #include <windows.h> #include <commctrl.h> #include <tlhelp32.h> #include "re ...

  6. Microsoft.Office.Inter.Excel.dll在調用時可能會出現如下錯誤

    Microsoft.Office.Inter.Excel.dll在調用時可能會出現如下錯誤,具體解決方案如下: 1. 錯誤資訊:檢索 COM 類工廠中 CLSID 為{00024500-0000-00 ...

  7. Kaggle——NFL Big Data Bowl

    neural networks + feature engineering for the win 导入需要的库 import numpy as np import pandas as pd impo ...

  8. python代码技术优化

    numba 编译优化 from numba import jit @jit def eval_mcc(y_true, y_prob, threshold=False): idx = np.argsor ...

  9. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:TensorFlow图像处理函数

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #读取图片 image_raw_data = tf ...

  10. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...