zoukankan      html  css  js  c++  java
  • 「题解」Solution P5755

    Description

    P5755

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

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

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

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

    Solution

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

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

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

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

    最后把这些差相加即可。

    记得最后加个 (1) 啊(因为这个 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

  • 相关阅读:
    SQL Server 错误(待补充)
    PageLayoutControl的基本操作
    C#:MapControl基本操作代码整理
    ArcGis10.0常见错误
    TocControl控件图层无法显示问题
    ArcGIS 10 安装程序及破解文件
    C# 中运行exe程序
    MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it
    使用ZBar来读取条形码和二维码的方法
    初识MongoDB
  • 原文地址:https://www.cnblogs.com/Shu-chong/p/13264803.html
Copyright © 2011-2022 走看看