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 |
看pascal很费劲In Reply To:您有空的话帮忙看一下。。。。 Posted by:fujieyun at 2005-08-23 18:51:19 > {$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