有一句句子因為貼上的時候出現了一點問題空格全部丟失了。現在給一本字典,每個詞都對應這個詞出現的頻率(每十億)。根據這個頻率,我們可以根據下面的公式算出這個詞帶來的收益 p(word):
p(word)=len2(word)⋅ln(frequency(word))
其中 frequency 就是上面所提到的頻率。len 指的是單詞的長度。
特別的,對於字典中沒有出現過的詞,p(word)=0。
請對句子進行適當的分割,使得分割得到的所有詞收益之和最大。同乙個詞可以重複出現,收益算作多次。
input
先給出一本詞典,詞典的第一行是詞條數(詞條數約為 40 000),下面每行分別是單詞和對應出現頻率,用空格隔開。單詞中只會出現英文本母大小寫,不會有多餘的空格。每個單詞只會出現一次。頻率是乙個正實數。
所有單詞長度之和不超過 3⋅105,最長單詞長度不超過 30。
接下來一行乙個整數 t (t≤10),表示有 t 個查詢。
下面 t 行,每行乙個句子,句子長度不超過 5 000。句子中保證只含有英文本母大小寫。注意單詞匹配時,不區分大小寫。
詞典資料**於 wikipedia project gutenberg(可能需要**),其中 1-10000 詞彙。
查詢資料**於 ielts test。
output
對於每組資料,輸出兩行。
第一行是乙個實數,表示最大能達到的收益。輸出和答案相差不超過 10−3 即可認為正確。
第二行輸出一連串單詞,單詞和單詞之間用空格隔開。滿足:
把這些單詞依次串聯起來可以得到原句子;
所有單詞的收益值相加得到第一行的實數。
首先把每個單詞與其價值關聯起來便於查詢,用字典樹或者stl的map皆可,擔心map超時,用了字典樹。接下來便是如何去劃分單詞,定義dp
[i] 為以句子中第i個字母結尾時能得到的最大價值,可以得到狀態轉移方程:dp
[i]=
max(
dp[i
],dp
[j]+
val)
,其中0<=
j<
i ,表示取以第
j 個字母為結尾得到的價值加上從j+
1到i 構成的新單詞的價值中的最大值。題意又說單詞長度不超過30,所以j取
max(
i−30,
0)即可。另外怎麼記錄句子從**劃分呢?我們可以記錄每個位置由之前的某個位置更新而來,即記錄每個點的前驅,前驅就是句子劃分處
#include
using
namespace
std;
const
int n = 5000 + 10;
struct trie
}*root;
char str[n], tmp[n];
double dp[n];
int pre[n];
bool vis[n];
void trie_insert(char *s, double val)
p->val = val;
}double trie_query(int l, int r, char *s)
return p->val;
}void trie_del(trie *p)
void work(char *str)}}
printf("%.6f\n", dp[len]);
int id = len;
while(id != -1) vis[pre[id]] = true, id = pre[id];//從末尾開始尋找前驅並記錄
for(int i = 1; i <= len; i++)
printf("\n");
}int main()
scanf("%d", &m);
while(m--)
trie_del(root);
}return
0;}
Python 結巴分詞(1)分詞
利用結巴分詞來進行詞頻的統計,並輸出到檔案中。結巴分詞的特點 支援繁體分詞 支援自定義詞典 mit 授權協議 演算法 分詞引數 使用者詞典 載入詞典 使用者詞典 userdict.dict 雲計算 5 李小福 2 nr 創新辦 3 i easy install 3 eng 好用 300 韓玉賞鑑 3...
mysql 三分分詞 MySQL 中文分詞原理
一,首先我們來了解一下其他幾個知識點 1.mysql的索引意義?索引是加快訪問表內容的基本手段,尤其是在涉及多個表的關聯查詢裡。當然,索引可以加快檢索速度,但是它也同時降低了索引列的插入,刪除和更新值的速度。換通俗的話來講 mysql中的索引就是乙個特殊的平衡二叉樹,當在平衡二叉樹中搜尋某一條值的時...
ICTCLAS2010分詞工具
計算所漢語詞法分析系統 ictclas 中國科學院計算技術研究所在多年研究基礎上,耗時一年研製出了基於多層隱馬模型的漢語詞法分析系統 ictclas institute of computing technology,chinese lexical analysis system 該系統的功能有 中...