• POJ 3450 Corporate Identity


    二分枚举+KMP

    之前没注意字典序最小,WA了N次……

      1 #include <cstdio>
      2 #include <cstring>
      3 #include <cstdlib>
      4 #include <algorithm>
      5 
      6 using namespace std;
      7 
      8 const int MAXN = 4010;
      9 const int MAXL = 210;
     10 
     11 int N;
     12 char str[MAXN][MAXL];
     13 char temp[MAXL];
     14 char anser[MAXL];
     15 int nextval[MAXL];
     16 int len[MAXN];
     17 
     18 void GetNextVal( char *s, int lenth )
     19 {
     20     int i = 0, j = -1;
     21     nextval[0] = -1;
     22     while ( i < lenth )
     23     {
     24         if ( j == -1 || s[i] == s[j] )
     25         {
     26             ++i, ++j;
     27             if ( s[i] != s[j] ) nextval[i] = j;
     28             else nextval[i] = nextval[j];
     29         }
     30         else j = nextval[j];
     31     }
     32     return;
     33 }
     34 
     35 bool KMP( char *t, char *s, int lenth, int lenn )
     36 {
     37     GetNextVal( t, lenth );
     38     int i = 0, j = 0;
     39     while ( j < lenn )
     40     {
     41         if ( i == -1 || s[j] == t[i] )
     42         {
     43             ++i, ++j;
     44             if ( i == lenth ) return true;
     45         }
     46         else i = nextval[i];
     47         //if ( i == lenth ) return true;
     48     }
     49     return false;
     50 }
     51 
     52 bool check( int tpL )
     53 {
     54     bool flag = false;
     55     bool ok = false;
     56     for ( int st = 0; st + tpL - 1 < len[0]; ++st )
     57     {
     58         for ( int k = 0; k < tpL; ++k )
     59             temp[k] = str[0][ st + k ];
     60         temp[ tpL ] = '\0';
     61         //puts(temp);
     62 
     63         ok = true;
     64         for ( int i = 1; i < N; ++i )
     65             if ( !KMP( temp, str[i], tpL, len[i] ) )
     66             {
     67                 ok = false;
     68                 break;
     69             }
     70         if ( ok )
     71         {
     72             flag = true;
     73             if ( anser[0] == '\0' ||
     74                 ( strlen(anser) == strlen(temp) && strcmp( anser, temp ) > 0 ) || ( strlen(anser) < strlen(temp) ) )
     75                 strcpy( anser, temp );
     76         }
     77     }
     78     return flag;
     79 }
     80 
     81 int main()
     82 {
     83     while ( scanf( "%d", &N ), N )
     84     {
     85         int bound = 1 << 30;
     86         for ( int i = 0; i < N; ++i )
     87         {
     88             scanf( "%s", str[i] );
     89             len[i] = strlen( str[i] );
     90             bound = min( bound, len[i] );
     91         }
     92 
     93         int low = 0;
     94         int high = bound;
     95         int mid, ans = 0;
     96         anser[0] = '\0';
     97         while ( low <= high )
     98         {
     99             mid = ( low + high ) >> 1;
    100             if ( check( mid ) )
    101             {
    102                 ans = mid;
    103                 low = mid + 1;
    104             }
    105             else high = mid - 1;
    106         }
    107 
    108         if ( !ans ) puts("IDENTITY LOST");
    109         else puts(anser);
    110     }
    111     return 0;
    112 }
  • 相关阅读:
    CF1080D Olya and magical square
    CF1062D Fun with Integers
    leetcode378 Kth Smallest Element in a Sorted Matrix
    hdoj薛猫猫杯程序设计网络赛1003 球球大作战
    hihocoder1068 RMQ-ST算法
    hihocoder1032 最长回文子串
    hihocoder1394 网络流四·最小路径覆盖
    hihocoder1398 网络流五·最大权闭合子图
    【bzoj4562】HAOI2016食物链
    【bzoj1026】windy数
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3099270.html
Copyright © 2020-2023  润新知