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

  • 相关阅读:
    暗通道先验去雾算法及其几何意义的解释
    几种去雾算法介绍
    大气散射模型的推导
    散射介质环境中偏振成像图像的去散射方法
    最近的笔面试题知识整理一
    了解 Web Service
    数梦工厂笔试题回顾一----finally在return之后执行还是之前?
    Struts2的配置文件的加载
    Struts2中Action配置
    struts.xml的语法
  • 原文地址:https://www.cnblogs.com/Shu-chong/p/13264803.html
Copyright © 2011-2022 走看看