時間限制: 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 最近複習了下字典樹,讓後在巨巨的指導下補了這個題。字典樹在統計字首字尾都比較好用。在構建字典...