時間限制: 1 s
空間限制: 128000 kb
題目等級 : 鑽石 diamond
給出了n個單詞,已經按長度排好了序。如果某單詞i是某單詞j的字首,i->j算一次接龍(兩個相同的單詞不能算接龍)。
你的任務是:對於輸入的單詞,找出最長的龍。
輸入描述 input description
第一行為n(1<=n<=105)。以下n行每行乙個單詞(由小寫組成),已經按長度排序。(每個單詞長度<50)
輸出描述 output description
僅乙個數,為最長的龍的長度。
樣例輸入 sample inputia
intable
inter
樣例輸出 sample output
資料範圍及提示 data size & hint
1<=n<=105
思路:用hash表把所有的單詞給存起來
然後比較的時候用hash表比較
然後線性結構比較是否為字首的複雜度為n^2
然而n<=100000
超時穩穩的
那,如何優化呢?
考慮把線性比較轉化成樹
建立乙個根節點
我們從根節點找這個單詞的字首
如果沒有這個單詞的字首
則把這個單詞作為乙個葉節點生長在根節點上
如果找到了
則跳入這個葉節點
繼續從這個葉節點找字首
直到找不到,然後把這個單詞作為乙個新的葉節點生長在當前節點上
這樣會優化很多很多
輕鬆ac
來,上**:
#include#include#include
#include
#define mod 10000007
using
namespace
std;
struct
node ;
struct node edge[100001
];int n,len[100001],hash[100001][51],dp[100001
];int head[100001],num,ans=0
;string word[100001
];inline
void edge_add(int
from,int
to)void dfs(int now,int pos,int
be) }
}edge_add(be,pos);
}int
main()
dfs(
1,i,0
); }
cout
return0;
}
codevs 1051 接龍遊戲
時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 給出了n個單詞,已經按長度排好了序。如果某單詞i是某單詞j的字首,i j算一次接龍 兩個相同的單詞不能算接龍 你的任務是 對於輸入的單詞,找出最長的龍。輸入描述 input description 第一行為n 1 n 1...
codevs 1051 接龍遊戲
時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解給出了n個單詞,已經按長度排好了序。如果某單詞i是某單詞j的字首,i j算一次接龍 兩個相同的單詞不能算接龍 你的任務是 對於輸入的單詞,找出最長的龍。輸入描述 input description 第一行為n 1 n...
CODEVS 1051 接龍遊戲
題目描述 description 給出了n個單詞,已經按長度排好了序。如果某單詞i是某單詞j的字首,i j算一次接龍 兩個相同的單詞不能算接龍 你的任務是 對於輸入的單詞,找出最長的龍。輸入描述 input description 第一行為n 1 n 105 以下n行每行乙個單詞 由小寫組成 已經按...