Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
您有空的话帮忙看一下。。。。In Reply To:您的细节写得糙了吧,写得好的话可以到 1000ms的,当然trie时最好了 Posted by:sunmoonstar_love at 2005-08-23 17:59:49 {$I-,Q-,R-,S-} const maxn = 250000+10; var a : array [1..maxn] of record st1, st2 : string[10]; n1, n2 : longint; end; d, fa, rank : array [1..maxn*2] of longint; name : array [1..600020] of record name : string[10]; code : longint; end; n, m, now : longint; function findpa( p : longint ): longint; begin if fa[p] = p then findpa := p else begin fa[p] := findpa( fa[p] ); findpa := fa[p]; end; end; procedure union( a,b : longint ); begin if rank[a] > rank[b] then fa[b] := a else begin fa[a] := b; if rank[b] = rank[a] then inc( rank[b] ); end; end; function hash( st : string ): longint; var i, h, g : longint; begin h := 0; for i := 1 to length(st) do begin h := h shl 4 + ord( st[i] ); g := h and ($f0000000); if g>0 then h := h xor( g shr 24 ); h := h and (not g); end; h := h mod m; hash := h; {h := 0; for i := 1 to length(st) do h := (h*256 + ord( st[i] )) mod m;} end; procedure assign_code( st : string[10]; var p : longint ); var posi : longint; begin posi := hash( st ) mod m; {writeln( posi );} while (name[ posi ].name <> st)and(name[posi].code<>0) do posi := (posi + 1) mod m; if name[ posi ].code = 0 then begin name[ posi ].name := st; name[ posi ].code := now + 1; inc( now ); p := now; end else p := name[ posi ].code; end; function prime( p : longint ): boolean; var i : longint; begin prime := false; for i := 2 to trunc( sqrt(p) ) do if p mod i = 0 then exit; prime := true; end; procedure init; var i, j : longint; st : string; begin randomize; i := 0; st := ''; while not seekeof(input) do begin inc( i ); readln( st ); while st[ length(st) ] = ' ' do delete( st, length(st), 1 ); j := pos( ' ', st ); a[i].st1 := copy( st, 1, j-1 ); delete( st, 1, j ); a[i].st2 := st; while length(a[i].st1)<9 do a[i].st1 := ' ' + a[i].st1 ; while length(a[i].st2)<9 do a[i].st2 := ' ' + a[i].st2 ; end; n := i; m := round( 2*n*1.2 ); while not prime(m) do inc( m ); for i := 1 to n do begin assign_code( a[i].st1, a[i].n1 ); assign_code( a[i].st2, a[i].n2 ); {writeln( a[i].n1,' ', a[i].n2 );} end; {close( input ); close( output ); halt} end; procedure work; var i, j, p, q, pa, count : longint; begin fillchar( d, sizeof(d), 0 ); fillchar( fa, sizeof(fa), 0 ); fillchar( rank, sizeof(rank), 0 ); for i := 1 to now do fa[i] := i; for i := 1 to n do begin p := findpa( a[i].n1 ); q := findpa( a[i].n2 ); union( p, q ); inc( d[ a[i].n1 ] ); inc( d[ a[i].n2 ] ); end; count := 0; pa := findpa( 1 ); if odd( d[1] ) then inc( count ); for i := 2 to now do begin j := findpa( i ); if j<>pa then begin writeln( 'Impossible' ); exit; end; if odd( d[i] ) then inc( count ); end; if (count<>2)and(count<>0) then begin writeln( 'Impossible' ); exit; end; writeln( 'Possible' ); end; begin {assign( input,'2513.in' ); reset( input ); assign( output,'2513.out' ); rewrite( output );} init; work; {close( input ); close( output );} end. Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator