比爾去很多地方旅遊過。他在旅遊的同時留下了很多簡短的旅行筆記。筆記的形式是這樣的:
出發地 目的地
如下面就是三條合法的note:
swimmingpool oldtree
birdsnest garage
garage swimmingpool
在某一次搬家的時候,比爾的筆記本不小心散架了。於是他的筆記的順序被完全打亂了。他想請你幫個忙,幫他把這些筆記的順序整理好,先寫的筆記在前面。幸運的是,同乙個地方比爾至多只去過一次。也就是說,在這些筆記當中,乙個地方至多出現兩次,一次作為目的地,一次作為出發地。
第一行是乙個整數n,表示筆記的條數。n <= 12000。接下來有n行,每行一條筆記。筆記的兩個單詞的長度都不會超過15,兩個單詞之間以乙個空格分隔。
輸出整理好順序的筆記.
3 swimmingpool oldtree
birdsnest garage
garage swimmingpool
birdsnest garage
garage swimmingpool
swimmingpool oldtree
【限制】
對於50%的資料,n <= 1000。
對於100%的資料,n <= 12000。
演算法討論
二分+排序。把出發點陣列a和目的地陣列b分別排序,排序時連同a的日記編號一同排序,如果a[i]在b中沒有出現,那麼就是起點,s[i]就是第一條,再把b[s[i]]在a中尋找,就知道下一條路線,同理重複n次。
while a[i]do inc(i);
while a[j]>t do dec(j);
if i<=j then
begin
z:=a[i];a[i]:=a[j];a[j]:=z;
c:=s[i];s[i]:=s[j];s[j]:=c;
inc(i);dec(j);
end;
until i>j;
if lthen kp(l,j);
if ithen kp(i,r);
end;
procedure
kpp(l,r:longint);
var i,j:longint;
t,z:string;
begin
i:=l;j:=r;
t:=b[(l+r) div
2]; repeat
while b[i]do inc(i);
while b[j]>t do dec(j);
if i<=j then
begin
z:=b[i];b[i]:=b[j];b[j]:=z;
inc(i);dec(j);
end;
until i>j;
if lthen kpp(l,j);
if ithen kpp(i,r);
end;
var i,j:longint;
begin
readln(n);
for i:=1
to n do
begin
readln(y[i]);
x[i]:=copy(y[i],1,pos(' ',y[i])-1);
delete(y[i],1,pos(' ',y[i]));
a[i]:=x[i];
b[i]:=y[i];
s[i]:=i;
end;
kp(1,n);
kpp(1,n);
for i:=1
to n do
if b[ef(a[i])]<>a[i] then
begin
j:=s[i];
break;
end;
for i:=1
to n do
begin
writeln(x[j],' ',y[j]);
j:=find(y[j]);
end;
end.
c語言要點摘錄(15 20)
十五.編譯過程 file.c,file.h經過預處理器處理成為file.i,再經過編譯器 gcc 成為彙編file.s,再經過彙編器 as 成為file.o,最後通過聯結器 linker 成為可執行檔案。預處理器 1.處理所有的注釋,以空格代替 2.將所有的 define刪除,並展開所有定義的巨集 ...
hihocoder 1520 古老數字
時間限制 20000ms 單點時限 2000ms 記憶體限制 256mb 小hi有一張紙條,上面寫著乙個長度為n的整數。由於年代過於久遠,其中有些位置已經看不清了,我們用 來代替這個位置。小hi印象中記得這個數字除以x的餘數為y,他想知道這個數最小可能是多少?注意這個整數的首位不能是0,除非它本身等...
HDU 1520 簡單樹形dp
題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...