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 |
无奈了,用归并做得为什么总是超时呢? 改掉COUT CIN 还不行啊。。。#include<stdio.h> #include<string.h> #include<math.h> const long map[ 26 ] = { 2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0 }; const long MAX = 100000; class Arrange { // rearrange a array by alg : merge public : Arrange( void ); void Set_value( long , long, long ); void Set_len( long ); void Output( void ); void Merge( long , long , long ); void Merge_sort( long , long ); private : long A[ MAX ]; // data long Num[ MAX ]; // the amount of data long len; }; Arrange ::Arrange( void ) { long i; for ( i = 0; i < MAX; i ++ ) { A[ i ] = 100000000; Num[ MAX ] = 0; } } void Arrange ::Set_value( long a, long num, long i ) { A[ i ] = a; Num[ i ] = num; } void Arrange ::Set_len( long l ) { len = l; } void Arrange ::Output( ) { long i; for ( i = 1; i <= len; i ++ ) { printf( "%03ld-%04ld %ld\n", A[ i ] / 10000, A[ i ] % 10000 , Num[ i ] ); } } void Arrange ::Merge( long p, long q, long r ) { long L[ MAX ]; long L_num[ MAX ]; long R[ MAX ]; long R_num[ MAX ]; long L_len; long R_len; long i; long j; long k; L_len = q - p + 1; R_len = r - q; for ( i = 1; i <= L_len; i ++ ) { L[ i ] = A[ p + i - 1 ]; L_num[ i ] = Num[ p + i - 1 ]; } for ( i = 1; i <= R_len; i ++ ) { R[ i ] = A[ q + i ]; R_num[ i ] = Num[ q + i ]; } L[ L_len + 1 ] = 100000000; R[ R_len + 1 ] = 100000000; i = j = 1; for ( k = p; k <= r; k ++ ) { if ( L[ i ] <= R[ j ] ) { A[ k ] = L[ i ]; Num[ k ] = L_num[ i ]; i ++; } else { A[ k ] = R[ j ]; Num[ k ] = R_num[ j ]; j ++; } } } void Arrange ::Merge_sort( long p, long r ) { long q ; if ( p < r ) { q = ( p + r ) / 2; Merge_sort( p , q ); Merge_sort( q + 1, r ); Merge( p, q , r ); } } long main( void ) { Arrange Directory; long D_len; long List[ MAX ]; long Count[ MAX ]; long List_num; long Input_len; char Buffer[ 20 ]; long Buffer_len; long sum; long by; bool insert; bool duplicate; long i; long l; scanf( "%ld", &Input_len ); for ( l = 0; l < Input_len; l ++ ) { Count[ l ] = 0; } List_num = 0; // input all the data into List[ ..] & Count[ .. ] for ( l = 0; l < Input_len; l ++ ) { scanf( "%s", Buffer ); Buffer_len = strlen( Buffer ); sum = 0; by = 1000000; for ( i = 0; i < Buffer_len; i ++ ) { if ( Buffer[ i ] >= '0' && Buffer[ i ] <= '9' ) { sum += ( Buffer[ i ] - '0' ) * by; by /= 10; } else if ( Buffer[ i ] >= 'A' && Buffer[ i ] <= 'Z' ) { sum += map[ Buffer[ i ] - 'A' ] * by; by /= 10; } else { continue; } } insert = 1; for( i = 0; i < List_num; i ++ ) { if ( sum == List[ i ] ) { Count[ i ] ++; insert = 0; } } if ( insert ) { List[ List_num ] = sum; Count[ List_num ] ++; List_num ++; } } // put data into Directory duplicate = 0; for ( i = 0, D_len = 0; i < List_num; i ++ ) { if ( Count[ i ] > 1 ) { duplicate = 1; D_len ++; Directory.Set_value( List[ i ], Count[ i ], D_len ); } } Directory.Set_len( D_len ); if ( duplicate ) { Directory.Merge_sort( 1, D_len ); Directory.Output( ); } else { printf( "No duplicates.\n" ); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator