1 条题解

  • 0
    @ 2025-8-24 22:14:04

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 一只书虫仔
    End.

    搬运于2025-08-24 22:14:04,当前版本为作者最后更新于2020-07-07 16:57:47,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    Description

    P5755

    在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度,通常都要画出与单词列表所对应的单词查找树,其特点如下:

    • 根节点不包含字母,除根节点外每一个节点都仅包含一个大写英文字母;
    • 从根节点到某一节点,路径上经过的字母依次连起来所构成的字母序列,称为该节点对应的单词。单词列表中的每个词,都是该单词查找树某个节点所对应的单词;
    • 在满足上述条件下,该单词查找树的节点数最少。

    例:图一的单词列表对应图二的单词查找树

    对一个确定的单词列表,请统计对应的单词查找树的节点数 (包括根节点)

    Solution

    其实我们计算整个树的节点数运用读入的字符串的长度差就可以解决了。

    读入的时候运用一个字符串数组存储即可。

    然后读入之后要用一个 sort 进行排序。(然后才好计算差值)

    然后前后两个字符串的差定义为第二个字符串的长度减去两个字符串的公共部分的长度。

    最后把这些差相加即可。

    记得最后加个 11 啊(因为这个 WA 了 /kk)因为还要 包括根节点

    Code

    #include <bits/stdc++.h>
    
    using namespace std;
    
    string s[10086];
    
    int main () {
    	int len = 0;
    	while (cin >> s[++len])
    		continue;
    	sort(s + 1, s + len + 1);
    	int length = 0;
    	for (int i = 1; i <= len; i++) {
    		if (i == 1) {
    			length += s[i].length();
    			continue;
    		}
    		int tmp = 0;
    		while (s[i][tmp] == s[i - 1][tmp] && tmp < s[i - 1].length())
    			tmp++;
    		length += s[i].length() - tmp;
    	}
    	printf("%d", ++length);
    	return 0;
    }
    

    最后在 while (s[i][tmp] == s[i - 1][tmp] && tmp < s[i - 1].length()) 这一大行说明一下意思:

    • s[i][tmp] == s[i - 1][tmp] 指的是判断公共部分
    • tmp < s[i - 1].length()) 指的是判断超没超过前一个字符串的长度(其实这一步没必要,但实测会慢一点,10 多 ms)

    By Shuchong
    2020.7.7

    • 1

    信息

    ID
    4766
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者