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

  • 相关阅读:
    如何让dapper支持oracle游标呢?
    使用Polly让程序有Retry的机制
    js代码优化
    学习simple.data之基础篇
    如何在.net4.0中使用.net4.5的async/await
    异步导出excel
    让人蛋疼的“Oracle.DataAccess.dll”
    关于函数和方法总结
    linux和windows的区别
    01-linux软件包管理器安装和编译安装
  • 原文地址:https://www.cnblogs.com/Shu-chong/p/13264803.html
Copyright © 2011-2022 走看看