洛谷P1333 瑞瑞的木棍 字串 最短路

2022-05-31 15:03:09 字數 2408 閱讀 5217

用m↓寫的第一篇題解,歡迎提出意見.

瑞瑞有一堆的玩具木棍,每根木棍的兩端分別被染上了某種顏色,現在他突然有了乙個想法,想要把這些木棍連在一起拼成一條線,並且使得木棍與木棍相接觸的兩端顏色都是相同的,給出每根木棍兩端的顏色,請問是否存在滿足要求的排列方式。

例如,如果只有 \(2\) 根木棍,第一根兩端的顏色分別為 red, blue,第二根兩端的顏色分別為 red, yellow,那麼 blue---red | red----yellow 便是一種滿足要求的排列方式。

輸入有若干行,每行包括兩個單詞,表示一根木棍兩端的顏色,單詞由小寫字母組成,且單詞長度不會超過 \(10\) 個字母,最多有 \(250000\) 根木棍。

如果木棒能夠按要求排列,輸出possible,否則輸出impossible

輸入 #1

blue red

red violet

cyan blue

blue magenta

magenta cyan

輸出 #1
possible
一根木棒就相當於一條邊,木棒兩邊的顏色就是這條邊所連的點,所以此題就是問一張圖是否存在尤拉路。

尤拉路的判定很簡單——所有點都連通(並查集),最多兩個點的度為奇數(乙個陣列就可以搞定)。

那麼這道題之所以是藍題,是因為它對時間要求很嚴格——最多2.5e6個木棒,以及讀入的字串的處理。

這裡最最最快的方式是用\(trie\)。

\(trie\)中每個節點都有兩個元素,\(num\)標記和\(26\)個指標,這裡我們用陣列模擬指標:

設\(0\)是根節點,實際上不代表任何的字母

對於要加入的每乙個字串,逐位考慮

如果當前節點沒有str[i]這個子節點的話就新建乙個節點為子節點

跳轉到這個子節點,判斷下一位

重複3、4步驟

如果最終的節點沒有被分配乙個編號的話,那麼這個就新建乙個編號給這個終節點

這樣每乙個字串都有了唯一的編號,且編號是連續的,方便開陣列等後續操作。

這就完成了trie的部分——字串到正整數的對映。

struct trie

trie[2000010];

int n,trie_cnt;

int insert(string str)

判斷

判斷這裡我用了點小技巧,同時判斷度和並查集。

int flag=(degree[1]&1);

for(int i=2;i<=n;i++)

if(flag>2) cout<<"impossible"<#include#include#include#include#include#include#include#define il inline

#define re register

#define ll long long

#define ull unsigned long long

#define re register

#define debug printf("now is %d\n",__line__);

using namespace std;

templateinline void read(t&x)

}inline int read()

return x;

}int g[55];

templateinline void write(t x)

while(x);

for(re int i=g;i>=1;--i)putchar('0'+g[i]);putchar('\n');

}struct trie

trie[2000010];

int n,trie_cnt;

int insert(string str)

int flag=(degree[1]&1);

for(int i=2;i<=n;i++)

if(flag>2) cout<<"impossible"《在洛谷上提交的話,如果你\(#2\)無法通過,請注意陣列大小問題:

最多有\(2.5e6\)根木棒,意味著最多有\(5e6\)種單詞,所以陣列要開到\(5e6\),而\(trie\)陣列越大越好。

經過我的非精確計算,類似於線段樹,每一層新建分支\(26\),最多\(10\)層,(最多\(141,167,095,653,376\)個葉子節點),而題目中有單詞數量不超過\(2.5e6\),\(26^4=456976\),應該開到最多\(26+676+17576+2500000≈2,518,278\)即可。(這個是亂算的)

如果出現,有兩根相同的木棒怎麼辦?題目中並沒有否認這種情況,但是不這樣判斷的話也過了啊……奇怪啊。

如果以後這道題修改或者加強了,請來踢我一腳(

洛谷 P1334 瑞瑞的木板

瑞瑞想要親自修覆在他的乙個小牧場周圍的圍欄。他測量柵欄並發現他需要n 1 n 20,000 根木板,每根的長度為整數li 1 li 50,000 於是,他神奇地買了一根足夠長的木板,長度為所需的n根木板的長度的總和,他決定將這根木板切成所需的n根木板。瑞瑞在切割木板時不會產生木屑,不需考慮切割時損耗...

洛谷P1852 奇怪的字串

輸入兩個01串,輸出它們的最長公共子串行的長度 輸入格式 一行,兩個01串 輸出格式 最長公共子串行的長度 輸入樣例 1 複製 01010101010 00000011111輸出樣例 1 複製 601串長度 10000 資料好水啊 一開始想了乙個dp i 表示以b中到達i位置最長的lcs,f i 表...

洛谷 P4173 殘缺的字串

不知道xjb kmp可不可以做的說 假設下標都以0開頭 對於有一定偏移量的序列的 對應位置 匹配或者數值計算的題,這裡是有一種套路的,就是把其中乙個序列翻轉過來,然後卷積一下,所得到的新序列c的每乙個位置就包含了 所有原來一定偏移量的位置的乘積和。對於這個題,我們只需要找到一種方法,使相同的字元代表...