#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define eps 1e-11 #define INF 1000000009 #define PI 3.14159265358979323 #define sz(a) ((int)a.size()) #define pb push_back #define mset(a,h) memset(a,h,sizeof(a)) #define wh(a) (a).begin(),(a).end() #define all(a) (a).begin(),(a).end() #define REP(i,n) for(__typeof(n) i=0;i<(n);++i) #define REPS(i,n) for(int(i)=0;i=(b);--i) #define FORE(it,c) for(__typeof((c).begin()) it=(c).begin();it!=(c).end();++it) #define SQR(a) ((a)*(a)) #define pii pair #define mp make_pair #define fi first #define se second typedef long long LL; int S; char ch; vector< vector > M[105]; pii GAP[105]; int VIS[100][24*60]; string Dig[11][5]={ " - ", "| |", " . ", "| |", " - ", " . ", ". |", " . ", ". |", " . ", " - ", ". |", " - ", "| .", " - ", " - ", ". |", " - ", ". |", " - ", " . ", "| |", " - ", ". |", " . ", " - ", "| .", " - ", ". |", " - ", " - ", "| .", " - ", "| |", " - ", " - ", ". |", " . ", ". |", " . ", " - ", "| |", " - ", "| |", " - ", " - ", "| |", " - ", ". |", " - ", " . ", ". .", " . ", ". .", " . ", }; char MAT[5][3*4]; string TtoTs(vector t) { memset(MAT,' ',sizeof(MAT)); REPS(i,t) { REP(j,5) REP(k,3) MAT[j][i*3+k]=Dig[t[i]][j][k]; } string s=""; REP(i,5) REP(j,3*4) if (MAT[i][j]!=' ') s+=MAT[i][j]; return s; } vector tov(int h,int m) { vector v; v.pb(h/10); if (v[0]==0)v[0]=10; v.pb(h%10); v.pb(m/10); v.pb(m%10); return v; } void prv(vector v) { if (v[0]!=10) printf("%d",v[0]); printf("%d:%d%d\n",v[1],v[2],v[3]); } set > SEEN; pii vtop(vector v) { pii res; res.fi=(v[0]==10?0:v[0])*10+v[1]; res.se=v[2]*10+v[3]; return res; } int dist(vector a,vector b,int dir) { pii ap=vtop(a); pii bp=vtop(b); int ma=ap.fi*60+ap.se; int mb=bp.fi*60+bp.se; // cout<<"dist : "< > cur; set >nxt; int solve(int k,vector v,int dir) { cur.clear(); cur.insert(v); for (int i=k+dir;i>=0 && i=gap.fi && curd<=gap.se) nxt.insert(*jt); } cur=nxt; } return sz(cur); } int main() { while(scanf("%d",&S),S) { REP(k,S) { string s=""; REP(i,28) { cin>>ch; s+=ch; } if (k!=S-1) scanf("%d %d",&GAP[k].fi,&GAP[k].se); M[k].clear(); REP(h,24) REP(m,60) { vector cur_t=tov(h,m); string cur_ts=TtoTs(cur_t); bool isOk=1; REPS(i,cur_ts) if (cur_ts[i]!=s[i] && s[i]!='?') { isOk=0; break; } if (isOk)M[k].pb(cur_t); } } REP(k,S) { int val=k==0?1:k==S-1?2:0; if (k==0 && k==S-1) val=3; REPS(i,M[k]) VIS[k][i]=val; } REP(k,S-1) { pii gap=GAP[k]; int od=gap.fi,po=gap.se; REPS(i,M[k]) if (VIS[k][i]&1) REPS(j,M[k+1]) { int d=dist(M[k][i],M[k+1][j],1); // cout<<"VZD : "<po)break; } } /* cout<<"DEBUG"<po)break; } } REP(k,S) { int cnt=0; vector sol; REPS(i,M[k]) { vector v=M[k][i]; if (VIS[k][i]==3) { cnt++; sol=v; } } if (cnt==1) prv(sol); else printf("ambiguous, %d possibilities\n",cnt); } putchar('\n'); } return 0; }