pku 1043 What's In A Name ?

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std ;
  5. const int MAXN = 21 ;
  6. const int Max = 21 ;
  7. struct CRIMINAL
  8. {
  9.     char Name[MAXN] ;
  10.     char ID[MAXN] ;
  11.     int pos ;
  12. }Criminal[MAXN] ;
  13. int CnalNum ;
  14. bool CnalLeft[MAXN] ;
  15. char userID[MAXN][MAXN] ;
  16.         
  17. int leftNum , rightNum , link[MAXN] ;   
  18. bool array[Max][Max] , use[MAXN];
  19. bool find( int t )
  20. {
  21.     int i ; 
  22.     for ( i = 0 ; i < rightNum ; i++ )
  23.     {
  24.         if ( !use[i] && array[t][i] )
  25.         {
  26.             use[i] = true ;
  27.             if ( link[i] == -1 || find(link[i]) )
  28.             {
  29.                 link[i] = t ;
  30.                 return true ;
  31.             }
  32.         }
  33.     }
  34.     return false ;
  35. }
  36. int Bihungry()
  37. {
  38.     int i , ans = 0 ;
  39.     memset(link, 0xff, sizeof(link)) ;
  40.     for ( i = 0 ; i < leftNum ; i++ )
  41.     {
  42.         memset(use, 0, sizeof(use)) ;
  43.         if ( find( i ) )
  44.             ans++ ;
  45.     }
  46.     return ans ;
  47. }
  48.         
  49. int FindPos( char *str )
  50. {
  51.     int i , pos = -1 ;
  52.     for ( i = 0 ; i < CnalNum ; i++ )
  53.         if ( strcmp( Criminal[i].Name, str ) == 0 )
  54.         {
  55.             pos = i ;
  56.             break ;
  57.         }
  58.     return pos ;
  59. }
  60. int FindIDPos( char *id )
  61. {
  62.     int i , pos ;
  63.     for ( i = 0 ; i < rightNum ; i++ )
  64.         if ( strcmp( userID[i], id ) == 0 )
  65.         {
  66.             pos = i ;
  67.             break ;
  68.         }
  69.     return pos ;
  70. }
  71. void Init()
  72. {
  73.     CnalNum = 0 ;
  74.     memset(CnalLeft, 1, sizeof(CnalLeft)) ;
  75.     memset(array, 1, sizeof(array)) ;
  76.     int i ;
  77.     for ( i = 0 ; i < MAXN ; i++ )
  78.     {
  79.         strcpy(Criminal[i].ID, "???") ;
  80.     }
  81. }
  82. int cmp( const void* fc, const void *sc )
  83. {
  84.     return ( strcmp((*(CRIMINAL*)fc).Name,(*(CRIMINAL*)sc).Name) ) ;
  85. }
  86. int main()
  87. {
  88.     int n , i , j , pos ;
  89.     char cmd[2] , name[MAXN] ;
  90.     scanf("%d", &n) ;
  91.     rightNum = n ;
  92.     Init() ;
  93.     for ( i = 0 ; i < n ; i++ )
  94.     {
  95.         scanf("%s", &userID[i]) ;
  96.     }
  97.     while ( true )
  98.     {
  99.         scanf("%s", &cmd) ;
  100.         if ( strcmp( cmd , "Q" ) == 0 ) break ;
  101.         scanf("%s", &name) ;
  102.         if ( strcmp( cmd , "E" ) == 0 )
  103.         {
  104.             pos = FindPos( name ) ;
  105.             if ( pos == -1 )
  106.             {
  107.                 strcpy( Criminal[CnalNum].Name, name ) ;
  108.                 pos = CnalNum ;
  109.                 CnalNum++ ;
  110.             }
  111.             
  112.             CnalLeft[pos] = false ;
  113.         }
  114.         else if ( strcmp( cmd , "L" ) == 0 )
  115.         {
  116.             pos = FindPos( name ) ;
  117.             CnalLeft[pos] = true ;
  118.         }
  119.         else if ( strcmp( cmd, "M" ) == 0 )
  120.         {
  121.             pos = FindIDPos( name ) ;
  122.             for ( i = 0 ; i < n ; i++ )
  123.             {
  124.                 if ( CnalLeft[i] )
  125.                 {
  126.                     array[i][pos] = false ;
  127.                 }
  128.             }
  129.         }
  130.     }
  131.     leftNum = CnalNum ;
  132.     for ( i = 0 ; i < leftNum ; i++ )
  133.     {
  134.         for ( j = 0 ; j < rightNum && strcmp(Criminal[i].ID, "???") == 0 ; j++ )
  135.         {
  136.             if ( array[i][j] )
  137.             {
  138.                 array[i][j] = false ;
  139.                 if ( Bihungry() < leftNum )
  140.                     strcpy(Criminal[i].ID, userID[j]) ;
  141.                 array[i][j] = true ;
  142.             }
  143.         }
  144.     }
  145.     qsort( Criminal, CnalNum, sizeof(Criminal[0]), cmp) ;
  146.     for ( i = 0 ; i < leftNum ; i++ )
  147.     {
  148.         printf("%s:%s/n", Criminal[i].Name, Criminal[i].ID) ;
  149.     }
  150.     return 0 ;
  151. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值