【UVA】11732 – strcmp() Anyone?

【UVA】11732 – strcmp() Anyone?

大家好,又见面了,我是全栈君。

一開始不知道这样的一维建树方法。

每次一层用一个链指向下一层最左边的结点,之后每一层用一个链表串联全部的结点,这样就建树成功了。

14328524 11732 Accepted C++ 0.826 2014-10-09 13:13:14

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int,int> pill;
const int nodemaxn = 4000 * 1000 + 100;
struct Trie{
    int head[nodemaxn]; //左儿子链
    int next[nodemaxn]; //右兄弟链
    int   ch[nodemaxn]; //这个结点代表的字符
    LL   tot[nodemaxn]; //有几个单词经过了这个结点
    int   sz;           //结点个数
    LL   ret;           //比較的次数
    void clear(){
        head[0] = 0; next[0] = 0; tot[0] = 0; sz = 1; ret = 0;
    }
    void insert(char *str){
        int L = strlen(str);
        int u = 0,v,found;
        tot[0]++;
        for(int i = 0; i <= L; i ++){
            found = 0;
            for(v = head[u]; v != 0 ; v = next[v]){  //到下一层去找
                if(ch[v] == str[i]){
                    found = 1;
                    break;
                }
            }
            if(!found){  //假设没有找到
                v = sz ++;
                tot[v] = 0;
                ch[v] = str[i];
                next[v] = head[u];
                head[u] = v;
                head[v] = 0;
            }
            u = v;
            tot[u] ++;
        }
    }
    void dfs(int u,int depth){
        if(head[u] == 0){
            ret += tot[u] * (tot[u] - 1) * depth;
        }
        else{
            LL sum = 0;
            for(int v = head[u] ; v != 0; v = next[v])
                sum += tot[v] * (tot[u] - tot[v]);
            ret += sum / 2 * (2 * depth + 1);
            for(int v = head[u] ; v != 0; v = next[v])
                dfs(v,depth + 1);
        }
    }
}trie;
const int maxn = 4000 + 10;
int main(){
    int n,Case = 1;
    while(scanf("%d",&n) && n){
        trie.clear();
        for(int i = 0; i < n; i++){
            char str[maxn];
            scanf("%s",str);
            trie.insert(str);
        }
        trie.dfs(0,0);
        printf("Case %d: %lld\n",Case++,trie.ret);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115603.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据ETL是指什么

    数据ETL是指什么

    2021年10月28日
  • Laravel自定义 封装便捷返回Json数据格式引用

    Laravel自定义 封装便捷返回Json数据格式引用

    2021年11月7日
  • 国内外12个免费域名解析服务网站推荐

    国内外12个免费域名解析服务网站推荐一般域名使用注册商提供的域名解析服务虽然方便,但功能大多有限,特别是目前国内还会针对某些DNS服务器进行屏蔽,造成网站无法解析的情况出现,因此,使用第三方域名解析服务也是中国网站的必要选择,这里就介绍一些常见的免费域名解析服务。域名注册商提供的免费服务Godaddy :不在Godaddy注册域名,也可以使用Godaddy的域名解析服务,使用方法很简单,登录Godaddy网站后,点击“Add…

    2022年6月18日
  • idea创建javaweb项目详解_idea怎么创建普通java项目

    idea创建javaweb项目详解_idea怎么创建普通java项目初学javaweb不用maven不用gradle手把手教你如何创建自己的JavaWeb项目文章目录1.创建项目1.创建项目file→new→project(这里不用管直接下一步,我们给项目起一个名字!)如图项目已经创建好了!…

    2022年9月20日
  • 汉宫秋月曲谱_离人愁简谱

    汉宫秋月曲谱_离人愁简谱喜欢古风的朋友赶快凑过来啦,最近抖音上超火的离人愁拇指琴教学,喜欢离人愁的小姐姐小哥哥赶快学起来啦!以下琴谱适用于HughTraceyG调17键。南非琴出厂调音是G调排列,习惯了C调音阶排列的朋友可能对G调排列不是很适应。因为两者琴键对应的“数字音贴”位置不同。两者曲子的演奏效果会有所不同。考虑到大部分人习惯C调音阶排列,所以文章内分享的曲谱适用于C调17键。(PS适合经常使用拇指琴的小可爱,…

    2022年8月29日
  • Android View中OnKeyListener的onKey返回值

    Android View中OnKeyListener的onKey返回值1.前言在调试Android原生Setting开始中,遇到DialogPreference中用遥控器操作SeekBar到100%时,再按一次右键SeekBar焦点会跳至确定按钮中去。正常现象应该是停留至SeekBar尾部。2.问题分析根本原因就是焦点变化了,当SeekBar为100%时,再按一次右键让焦点停留再当前位置即可。进一步分析就是对按键进行处理,当满足条件时,使系统不再处理这个按键。3.原生代码片段在View.java中/***Interfacedefin

    2022年7月16日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号