2023年百度之星預賽第三題

2021-05-26 02:18:19 字數 903 閱讀 9943

題目描述:請編寫程式,根據指定的對應關係,把乙個文字中的字串替換成另外的字串。

輸出資料:在標準輸出上列印text.txt 被dict.txt 替換後了的整個文字。

評分標準:程式輸出結果必須正確,記憶體使用越少越好,程式的執行時間越快越好。

關於這道題的一些想法,最直接的做法是讀入字典,然後比較字串是否出現過,沒有出現過加入替換的字串,出現過了則替換。可以考慮使用對映,使用stl裡面的map。然後讀入text.txt字串,找到map的字串,如果存在替換輸出,沒有的話,輸出本身。

複雜度分析:構建字典的去重需要o(n^2),n為單詞個數。然後替換需要時間為o(n*m),m為text.txt文字中單詞的個數。而且裡面會大量使用字串比較函式strcmp。

其實,上面那種想法有點繞彎了,可以不去重的,「以最後出現的那次s1 所對應的s2 為準」,那麼只要將dict.txt讀到乙個list裡面,然後從list後面往前面比較,如果相同替換,不同列印本身。複雜度為o(n*m)。

這種方法我沒有去實現。有興趣的同學可以試試。

另外一種思路,其實這道題歸根結底就是字串比較的問題,text.txt文字中字串s1,如果和dict.txt中的s2(最後出現的)相同,則替換。則不管s1和s2中包含那種字元,中文字元也好,英文本元也好,他們的位元組流一定是相同的。(因為c++是gb2312編碼,中文字元是2位元組,英文本元是1位元組的,而這中文字元的位元組的取值範圍是161-255,具體可以參見

這裡面中文字元的處理方式)。

那麼我們可以構建一棵trie樹,樹底下有256(乙個位元組取值範圍為0-255)個節點,用於構建字典樹,耗時為o(n)。事實上為o(n*k),k為字串長度,上面字串比較的時候沒有考慮k,在這裡也就忽略了。那麼替換text.txt字串的複雜度為o(m),同樣忽略了k,速度跟上面那種方法比較應該能夠取得很大的進步。**實現如下:

2023年百度之星程式設計大賽試題初賽題目 題1

第一題 共四題 100 分 連續正整數 10 分 題目描述 乙個正整數有可能可以被表示為 n n 2 個連續正整數之和,如 15 1 2 3 4 5 15 4 5 6 15 7 8 請編寫程式,根據輸入的任何乙個正整數,找出符合這種要求的所有連續正整數序列。輸入資料 乙個正整數,以命令列引數的形式提...

2023年百度之星程式設計大賽試題初賽題目 題3

第三題 共四題 100 分 字串替換 30 分 題目描述 請編寫程式,根據指定的對應關係,把乙個文字中的字串替換成另外的字串。輸入資料 程式讀入已被命名為 text.txt 和 dict.txt 的兩個輸入資料文字檔案,text.txt 為乙個包含大量字串 含中文 的文字,以 whitespace ...

百度之星B題

include include include include include include includeusing namespace std define clr arr,v memset arr,v,sizeof arr const double inf 1e 10 struct node...