【NOI2000】 單詞查找樹

問題描述

在進行文法分析的時候,一般須要檢測一個單詞是否在咱們的單詞列表裏。爲了提升查找和定位的速度,一般都畫出與單詞列表所對應的單詞查找樹,其特色以下:c++

  1. 根結點不包含字母,除根結點外每個結點都僅包含一個大寫英文字母;數組

  2. 從根結點到某一結點,路徑上通過的字母依次連起來所構成的字母序列,稱爲該結點對應的單詞。單詞列表中的每一個單詞,都是該單詞查找樹某個結點所對應的單詞;atom

  3. 在知足上述條件下,該單詞查找樹的結點數最少。spa

  4. 例以下圖左邊的單詞列表就對應於右邊的單詞查找樹。注意,對一個肯定的單詞列表,請統計對應的單詞查找樹的結點數(包含根結點)。code

示意圖

輸入格式

爲一個單詞列表,每一行僅包含一個單詞和一個換行 "/" 回車符。每一個單詞僅由大寫的英文字母組成,長度不超過 63 個字母 。文件總長度不超過 32K ,至少有一行數據。orm

輸出格式

僅包含一個整數,該整數爲單詞列表對應的單詞查找樹的結點數xml

樣例一

input

A
AN
ASP
AS
ASC
ASCII
BAS
BASIC

output

13

數據範圍與約定

時間限制: 1s1sblog

內存限制: 256MB256MB256MB排序

 

頭一次見string類型這樣用2333ip

就是說:例如

string a[500];

這樣的變量a是能夠變爲二維數組的;

好比:a[i][j] 就表示了字符串a這個集合中有字符串a[i];而a[i][j]表示串a的第j個字符;

並且,原來string自帶.size();不再用sizeof()了qwq

看來我基礎並不過關

 

好了上代碼:
其實我是爆搜的:

(怕不是出題人懶得寫數據

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int  maxn=100010;
 4 string dan[maxn];//單詞的集合
 5 int ans;
 6 int main(){
 7     int i=1;
 8     while (cin>>dan[i]) i++; //讀入數據
 9     int n=i-1; //最後多加了一個1
10     sort (dan+1,dan+1+n); //將字符串排序,注意,是串的排序而不是字符的
11     ans=dan[1].size()+1; //最小那個鐵定是樹的一條鏈
12     for(int i=2;i<=n;i++){
13         int j=0; //每次初始化j,保證剛開始掃的時候j沒有值
14         while (dan[i][j]==dan[i-1][j]) {
15             j++; //統計有多少個字母同樣能夠合併
16         }
17         ans+=(dan[i].size()-j); //每次加上不同的,即節點
18     }
19     cout<<ans; //輸出
20     return 0;
21 }
相關文章
相關標籤/搜索