Code: Select all
// Telephone Tangles - acm.uva.es/p/v1/139.html
// by Artur Dmowski
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define MAXL 10001
#define REP(i,n) for(int i=0,tn=n; i<tn; i++)
using namespace std;
// DATA
char *name[MAXL],*code[MAXL],*dial;
double cost[MAXL];
int n=0,i=0,t,c;
// FUNC
bool prefix( char *p, char*s ) {
int k = strlen(p);
REP(c,k) if( p[c] != s[c] ) return 0;
k = strlen(s)-k;
return k>=4&&(s[1]=='0'?k<=10:k<=7);
}
int search( char *num ) {
int k = n, l = -1, d;
if( num[0] != '0' ) return n+1;
REP(a,n) if( prefix(code[a],num) ) d=strlen(code[a]), (l<d ? l=d,k=a : l=l);
return k;
}
// MAIN
int main() {
#ifndef ONLINE_JUDGE
freopen("139.in", "r", stdin);
#endif
memset( cost, -1, sizeof(cost) );
memset( name, 0, sizeof(name) );
REP(a,MAXL) name[a] = (char*) malloc(30), code[a] = (char*) malloc(10);
dial = (char*) malloc(50);
while( scanf("%s ",code[n]) && strcmp(code[n],"000000") ) {
gets( name[n] ); i=0;
while( name[n][i] != '$' ) i++;
name[n][i] = '\0';
sscanf(name[n]+i+1,"%llf", &cost[n]);
cost[n] /= 100.0;
n++;
}
name[n ] = "Unknown";
name[n+1] = "Local", cost[n+1] = 0.00;
while( scanf("%s %d\n",dial,&t) && strcmp(dial,"#") ) {
i = search( dial ), c = strlen(code[i])*(i!=n+1);
printf("%s %s", dial, name[i]);
if( i != n ) printf(" %s", dial+c);
printf(" %d", t);
if( i != n ) printf(" %.2f %.2f\n",cost[i],t*cost[i]);
else printf(" %.2f\n",-1.00);
}
return 0;
}