• 字典树解法(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. 2019年春PAT甲级考试

    这次考试不是很理想,一道题目没能做完. 自己原因差不多三条: 1.自己实力不够,准备时间也有点仓促,自己没能做到每道题目都有清晰的思路. 2.考试的心理素质不行,因为设备原因东奔西跑浪费了挺多时间,自 ...

  2. 【Gson】网页上String获取的Json数据转化为对象

    1.网络上获取的String Json格式转化为对象获取数据: 需要的包:Gson Maven依赖: <!-- https://mvnrepository.com/artifact/com.go ...

  3. Windows下将Python源代码.py文件封装成exe可执行文件方法

    安装pyinstaller cmd中使用pip安装 pip install pyinstaller 同时会自动安装pywin32(pip真慢50M这里就走20KB),可以进行切换为国内源进行提速. 就 ...

  4. modbus 指令16 $10 的格式

    { //写多个请求 01(从设备)10(功能码) 00 77(起始地址) 00 01(寄存器数) 02(字节数) 05 55(写的数据) 6F B8(CRC) //写多个返回 01(从设备) 10(功 ...

  5. 用c语言实现的几个小项目

    1.参考:Linux系统编程 2.参考:制作简单计算器 3.参考:制作2048小游戏 4.参考:五子棋实现

  6. session和token区别

    分布式系统认证/授权目前分布式系统存在两种常用的认证授权方式:分布式session和token 1.session的概念 session中存放登录用户的个人信息,创建session时,随机生成一个se ...

  7. C语言代码在内存中的存储

    http://blog.chinaunix.net/uid-26430381-id-4359960.html

  8. 关于前端Dom的总结

    简介 DOM (Document Object Model) 文档对象模型 DOM思想使用节点树(node tree)的概念来描述一个HTML页面,页面中的每一个元素.属性.文本都被认为是节点.此外, ...

  9. is,数据类型补充,set,深浅拷贝

    十二.基础数据类型补充: 1.join 可以把列表变成字符串. s = ‘abc’ s1 = s.join(‘非常可乐’) print(s1)  #非abc常abc可abc乐abc s = " ...

  10. 如何在linux中运行sql文件

    1.在linux中进入sql命令行 mysql -u root -p   输入密码 2.假设home下面有a.sql文件 先得use databasename,要不会报错 “No Database S ...