【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)
上一篇 2022年2月2日 上午7:00
下一篇 2022年2月2日 上午8:00


相关推荐

  • paoding分词TokenStream的使用

    paoding分词TokenStream的使用[code="java"]importjava.io.IOException;importjava.io.StringReader;importnet.paoding.analysis.analyzer.PaodingAnalyzer;importorg.apache.lucene.analysis.Analyzer;importorg.apache.lu…

    2022年7月22日
    13
  • java基本数据类型传递与引用传递区别详解

    java基本数据类型传递与引用传递区别详解java 的值传递和引用传递在面试中一般都会都被涉及到 今天我们就来聊聊这个问题 首先我们必须认识到这个问题一般是相对函数而言的 也就是 java 中的方法参数 那么我们先来回顾一下在程序设计语言中有关参数传递给方法 或函数 的两个专业术语 按值调用 callbyvalue 按引用调用 callbyrefere 所谓的按值调用表示方法接收的是调用着提

    2026年3月19日
    2
  • 新氧ubuntu 9.04中文定制 Release 版(推荐)

    新氧ubuntu 9.04中文定制 Release 版(推荐)以下内容转自新氧 http xylinux com product html 一 简化的安装过程 安装界面 新氧对 ubuntu 安装界面进行了定制 取消了语言选择弹出菜单 默认仅使用简体中文界面 采用微软雅黑字体 将 ubuntu 默认的主菜单居中对齐改为居右向左对齐 添加了重新启动和关机快捷键 并将菜单设为默认从硬盘启动

    2026年3月19日
    5
  • 小白也能行!10分钟用Cursor搭建个人博客网站(零基础教程)

    小白也能行!10分钟用Cursor搭建个人博客网站(零基础教程)

    2026年3月15日
    3
  • Eclipse汉化教程——只用于学习用途

    Eclipse汉化教程——只用于学习用途Eclipse2019版本汉化教程首先这里我已经做了汉化了,但是不影响各位学习怎么汉化,首先打开工具栏的帮助按钮,选中倒数第四个按钮,如下图所示(看不懂英文的朋友不要紧,对照图上位置即可),如下图所示:然后会打开这个页面然后打开这个网址(默认是英文的)语言包地址(点击左边这个蓝色的字体)出现下面的页面复制图中标记的地址注意官网这个地址中,如果用谷歌浏览器翻译后:号用的是中…

    2022年5月3日
    47
  • linux之alternatives管理多版本软件

    linux之alternatives管理多版本软件今天偶然间看到了 usr sbin alternatives 这个东西 感觉很陌生 于是学习了一番简单来说 比如系统中安装了多个版本的 jdk 那么怎么设置系统默认的 Jdk 呢 这个就是 alternatives 的功能 nbsp nbsp 学习过程 nbsp 1 首先在 linux 装了 1 8 版的 java 它被作为系统默认的 java root localhostcon java vers

    2026年1月19日
    1

发表回复

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

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