upc 6360 詞韻(字典樹 dp)

2021-08-21 19:35:54 字數 2025 閱讀 2715

時間限制: 2 sec  記憶體限制: 128 mb

題目描述

adrian 很喜歡詩歌中的韻。他認為,兩個單詞押韻當且僅當它們的最長公共 字尾的長度至少是其中較長單詞的長度減一。也就是說,單詞 a 與單詞 b 押韻 當且僅當 lcs(a, b) ≥ max(|a|, |b|) – 1。(其中 lcs 是最長公共字尾 longest common suffix 的縮寫)

現在,adrian 得到了 n 個單詞。他想從中選出盡可能多的單詞,要求它們能 組成乙個單詞序列,使得單詞序列中任何兩個相鄰單詞是押韻的。

輸入第一行是乙個整數n。

接下來n行,每行乙個由小寫英文本母組成的字串,表示每個單詞。所有單詞互不相同。

輸出輸出一行,為乙個整數,表示最長單詞序列的長度。

樣例輸入

5

askpsk

kkrafna

sk​

樣例輸出

4
提示

一種最長單詞序列是 ask-psk-sk-k。

30%的測試資料:1 ≤ n ≤ 20,所有單詞長度之和不超過 3 000。

100%的測試資料:1 ≤ n ≤ 500 000,所有單詞長度之和不超過 3 000 000。

按照題意,如果兩個單詞是押韻的那麼這兩個單詞的長度之差不超過一。所以將單詞逆置, 字尾變字首, 建立字典樹,符合要求的節點是   節點i是單詞結尾, 節點i的父節點, 兄弟節點, 兒子節點並且是單詞結尾。理想情況, 乙個短的單詞可以連線兩個長的單詞。 所以 fl[i] 表示 以i的兒子節點作為根節點的最長序列長度, sl[i] 表示 以i的兒子節點作為根節點的次長序列長度,所以

fl[pre[i]] =  f[i] + (vis[i] ? sons[i] : sons[i] - 1)

其中pre[i]表示 i 的父節點, vis[i] 表示i是否為單詞結尾, sons[i] 表示 i 的兒子是單詞結尾的節點的個數  sl[pre[i] 在過程中維護次小值就行了

#include #define mset(a, x) memset(a, x, sizeof(a))

using namespace std;

typedef long long ll;

const int n = 1e6 + 5;

const int inf = 0x3f3f3f3f;

int head[n * 3], cnt, index = 1;// index總下標,樹的唯一下標

int vis[n * 3];// 標記單詞結尾

int pre[n * 3];

int sons[n * 3];

char res[n * 3]; // 記錄每乙個節點的字元

int fl[n * 3], sl[n * 3];// 最大序列, 次大序列

string str;

int len;

struct node edge[n * 3];

void init()

void add(int u,int v)

// 建立字典樹

void creat()

} if (!flag)

} // 插入

while (i < str.length())

vis[rt] = 1;

sons[pre[rt]]++;

}int main()

// 進行dp

for (int i = index - 1; i >= 0; i--)

// 從葉子節點開始dp

for (int i = index - 1; i >= 1; i--) else if (fl[i] + (vis[i] ? sons[i] : sons[i] - 1) > sl[pre[i]])

} int maxn =1 ;

for (int i = 0; i < index; i++)

cout << maxn << endl;

return 0;

}

upc 6360 詞韻(字典樹上dp)

時間限制 2 sec 記憶體限制 128 mb 提交 134 解決 18 提交 狀態 討論版 命題人 admin 題目描述 adrian 很喜歡詩歌中的韻。他認為,兩個單詞押韻當且僅當它們的最長公共 字尾的長度至少是其中較長單詞的長度減一。也就是說,單詞 a 與單詞 b 押韻 當且僅當 lcs a,...

UPC 6359 售票 字典樹

題目描述 c 市火車站最近出現了一種新式自動售票機。買票時,乘客要先在售票機上 輸入終點名稱。一共有 n 處目的地,隨著乘客按順序輸入終點名稱的每個字母,候選終點站數目會逐漸減少。在自動售票機螢幕上,有乙個 4 行 8 列的鍵盤,如下圖所示。在乘客每輸入乙個字母後,鍵盤上只有有效字元是可選的 取決於...

upc 單詞表 字典樹 dfs

單詞表 時間限制 1 sec 記憶體限制 128 mb 題目描述 hzwer獲得了乙個n個單詞的單詞表,其中每個字元都是小寫字母,現在,他想和他的妹子研究一下這個單詞表。設編號為u的單詞與編號為v的單詞 u 最近複習了下字典樹,讓後在巨巨的指導下補了這個題。字典樹在統計字首字尾都比較好用。在構建字典...