- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std ;
- const int MAXN = 21 ;
- const int Max = 21 ;
- struct CRIMINAL
- {
- char Name[MAXN] ;
- char ID[MAXN] ;
- int pos ;
- }Criminal[MAXN] ;
- int CnalNum ;
- bool CnalLeft[MAXN] ;
- char userID[MAXN][MAXN] ;
- int leftNum , rightNum , link[MAXN] ;
- bool array[Max][Max] , use[MAXN];
- bool find( int t )
- {
- int i ;
- for ( i = 0 ; i < rightNum ; i++ )
- {
- if ( !use[i] && array[t][i] )
- {
- use[i] = true ;
- if ( link[i] == -1 || find(link[i]) )
- {
- link[i] = t ;
- return true ;
- }
- }
- }
- return false ;
- }
- int Bihungry()
- {
- int i , ans = 0 ;
- memset(link, 0xff, sizeof(link)) ;
- for ( i = 0 ; i < leftNum ; i++ )
- {
- memset(use, 0, sizeof(use)) ;
- if ( find( i ) )
- ans++ ;
- }
- return ans ;
- }
- int FindPos( char *str )
- {
- int i , pos = -1 ;
- for ( i = 0 ; i < CnalNum ; i++ )
- if ( strcmp( Criminal[i].Name, str ) == 0 )
- {
- pos = i ;
- break ;
- }
- return pos ;
- }
- int FindIDPos( char *id )
- {
- int i , pos ;
- for ( i = 0 ; i < rightNum ; i++ )
- if ( strcmp( userID[i], id ) == 0 )
- {
- pos = i ;
- break ;
- }
- return pos ;
- }
- void Init()
- {
- CnalNum = 0 ;
- memset(CnalLeft, 1, sizeof(CnalLeft)) ;
- memset(array, 1, sizeof(array)) ;
- int i ;
- for ( i = 0 ; i < MAXN ; i++ )
- {
- strcpy(Criminal[i].ID, "???") ;
- }
- }
- int cmp( const void* fc, const void *sc )
- {
- return ( strcmp((*(CRIMINAL*)fc).Name,(*(CRIMINAL*)sc).Name) ) ;
- }
- int main()
- {
- int n , i , j , pos ;
- char cmd[2] , name[MAXN] ;
- scanf("%d", &n) ;
- rightNum = n ;
- Init() ;
- for ( i = 0 ; i < n ; i++ )
- {
- scanf("%s", &userID[i]) ;
- }
- while ( true )
- {
- scanf("%s", &cmd) ;
- if ( strcmp( cmd , "Q" ) == 0 ) break ;
- scanf("%s", &name) ;
- if ( strcmp( cmd , "E" ) == 0 )
- {
- pos = FindPos( name ) ;
- if ( pos == -1 )
- {
- strcpy( Criminal[CnalNum].Name, name ) ;
- pos = CnalNum ;
- CnalNum++ ;
- }
- CnalLeft[pos] = false ;
- }
- else if ( strcmp( cmd , "L" ) == 0 )
- {
- pos = FindPos( name ) ;
- CnalLeft[pos] = true ;
- }
- else if ( strcmp( cmd, "M" ) == 0 )
- {
- pos = FindIDPos( name ) ;
- for ( i = 0 ; i < n ; i++ )
- {
- if ( CnalLeft[i] )
- {
- array[i][pos] = false ;
- }
- }
- }
- }
- leftNum = CnalNum ;
- for ( i = 0 ; i < leftNum ; i++ )
- {
- for ( j = 0 ; j < rightNum && strcmp(Criminal[i].ID, "???") == 0 ; j++ )
- {
- if ( array[i][j] )
- {
- array[i][j] = false ;
- if ( Bihungry() < leftNum )
- strcpy(Criminal[i].ID, userID[j]) ;
- array[i][j] = true ;
- }
- }
- }
- qsort( Criminal, CnalNum, sizeof(Criminal[0]), cmp) ;
- for ( i = 0 ; i < leftNum ; i++ )
- {
- printf("%s:%s/n", Criminal[i].Name, Criminal[i].ID) ;
- }
- return 0 ;
- }