破碎的路徑

2021-08-15 02:55:42 字數 2873 閱讀 7427

description

比爾去很多地方旅遊過。他在旅遊的同時留下了很多簡短的旅行筆記。筆記的形式是這樣的:

出發地 目的地

如下面就是三條合法的note:

swimmingpool oldtree

birdsnest garage

garage swimmingpool

在某一次搬家的時候,比爾的筆記本不小心散架了。於是他的筆記的順序被完全打亂了。他想請你幫個忙,幫他把這些筆記的順序整理好,先寫的筆記在前面。幸運的是,同乙個地方比爾至多只去過一次。也就是說,在這些筆記當中,乙個地方至多出現兩次,一次作為目的地,一次作為出發地。

input

第一行是乙個整數n,表示筆記的條數。n <= 12000。接下來有n行,每行一條筆記。筆記的兩個單詞的長度都不會超過15,兩個單詞之間以乙個空格分隔。

output

輸出整理好順序的筆記.

sample input

3 swimmingpool oldtree

birdsnest garage

garage swimmingpool

sample output

birdsnest garage

garage swimmingpool

swimmingpool oldtree

data constraint

hint

【限制】

對於50%的資料,n <= 1000。

對於100%的資料,n <= 12000。

分析 看題我們知道——這是一條鏈

我用了雜湊,確定字串的編號

如果在讀入中雜湊表判斷已出現的,那麼肯定同時作為出發地和目的地出現過,那麼這個點很明顯就是中間的點

然後一遍遍歷一邊輸出即可

程式:

var

u,v:array[0..12000]of longint;

s1,s2:array[0..12000]of string;

son:array[0..60000]of longint;

hash:array[0..60000]of string;

n,s:longint;

b,p:array[0..60000]of boolean;

zfc:string;

function

locate

(s:string):longint;

varl,h,k,i:longint;

begin

l:=length(s);h:=0;k:=1;

for i:=0

to l-1

dobegin

h:=h+(ord(s[i])*k) mod

56399;

k:=k*10

mod56399;

end;

while (hash[(h+i) mod

56399]<>'')and(hash[(h+i) mod

56399]<>s) do inc(i);

exit((h+i) mod

56399);

end;

procedure

insert

(s:string);

vari:longint;

begin

i:=locate(s);

hash[i]:=s;

end;

function

member

(s:string):boolean;

vari:longint;

begin

i:=locate(s);

if hash[i]=s then

exit(true) else

exit(false);

end;

procedure

init;

varcount,i:longint;

begin

readln(n);

count:=0;

while (countdo

begin

readln(zfc);

s1[count]:=copy(zfc,1,pos(' ',zfc)-1);

s2[count]:=copy(zfc,pos(' ',zfc)+1,length(zfc)-pos(' ',zfc));

if (member(s1[count])=true) then p[locate(s1[count])]:=true

else insert(s1[count]);

if (member(s2[count])=true) then p[locate(s2[count])]:=true

else insert(s2[count]);

inc(count);

u[count]:=locate(s1[count-1]);

v[count]:=locate(s2[count-1]);

son[u[count]]:=count;

end;

for count:=0

to n-1

doif (p[locate(s1[count])]=false) then s:=locate(s1[count]);

end;

procedure

print;

vari:longint;

begin

i:=son[s];

while (i>0) do

begin

writeln(hash[u[i]],' ',hash[v[i]]);

i:=son[v[i]];

end;

end;

begin

init;

print;

end.

jzoj1520 破碎的路徑

比爾去很多地方旅遊過。他在旅遊的同時留下了很多簡短的旅行筆記。筆記的形式是這樣的 出發地 目的地 如下面就是三條合法的note swimmingpool oldtree birdsnest garage garage swimmingpool 在某一次搬家的時候,比爾的筆記本不小心散架了。於是他的筆...

破碎的砝碼問題

1.問題描述 一天商人不小心把40磅重的砝碼摔成4部分,發現4部分砝碼的重量都是整磅數,而且可以用它們稱出任意1 40之間的整數磅質量,問這四塊砝碼各重多少磅?2.該問題的數學分析 必須有1磅的砝碼,否則39磅的重量無法稱出.有了1磅的砝碼後,再加上乙個3磅的砝碼,可稱出2 4磅的重量.有了1磅和3...

破碎的砝碼問題

法國數學家梅齊亞克在它的 數學組合遊戲 中提出了這樣乙個問題 乙個商人有乙個重量為40磅的砝碼,有一天他不小心將該砝碼摔成了4塊。商人發現每塊砝碼的重量都是整磅數,而且每塊砝碼的重量各不相同,並且發現這四塊砝碼碎片可以在天平上稱出1 40磅之間的任意重量 整磅數 問這四塊砝碼碎片的重量各是多少?1 ...