zoj - 3700的题解
		 
 
	  		
	  zoj - 3700
巨恶心的模拟题,,
题意: 记录每个单词出现的次数,注意,,这里I'd的情况I和d会记录成两个单词,,在这里wa到怀疑人生,,, 
按次数分组后从大到小输出每个组里最长的单词
如果有两个相同长度的合法单词,那么他们按字典序排序后输出倒数第二的单词;
直接模拟,,注意细节, 切记检查边界条件;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
   | #include<cstdio> #include<cstring> #include<string> #include<sstream> #include<map> #include<vector> #include<iostream> #include<algorithm> using namespace std;
  inline bool check(char &x){     if(x >= 'A' && x <= 'Z')x -= 'A' - 'a';     return (x >= 'a' && x <= 'z'); }
  inline bool cmp(string a, string b){     if(a.length() != b.length())return a.length() > b.length();     else{         int le = a.length();         for(int i = 0; i < le; i++){             if(a[i] < b[i])return true;             else if(a[i] > b[i])return false;         }     }     return false; }
  int main() {     int T;     scanf("%d", &T);     while(T--){         vector<string>ans[5500];         bool cz[5500];         map<string, int>m;         memset(cz, 0, sizeof(cz));         int n;         scanf("%d", &n);         getchar();         string tem;         while(n--){             getline(cin, tem);             if(tem.empty())continue;             istringstream ss(tem);             string s;             while(ss >> s){                 while(!s.empty() && !check(s[0]))s.erase(0, 1);                 if(s.empty())continue;                 int le = s.length();                 while(!s.empty() && !check(s[le - 1])){                 s.erase(le - 1, 1);                 le = s.length();                 }                 if(s.empty())continue;                 bool is = true;                 le = s.length();                 string tt;                 for(int i = 0; i < le; i++){                     if(check(s[i]))tt += s[i];                     else{                         m[tt]++;                         tt.clear();                     }                 }                 m[tt]++;             }         }             if(m.empty()){                 putchar('\n');                 continue;             }             map<string, int>::iterator it = m.begin();             for(; it != m.end(); it++){                 ans[it->second].push_back(it->first);                 cz[it->second] = true;             }             bool sc = false;             for(int i = 5000; i > 1; i--){                 if(cz[i]){                     sort(ans[i].begin(), ans[i].end(), cmp);                     if(ans[i].size() == 1 || ans[i][0].length() > ans[i][1].length()){                             if(sc)putchar(' ');                             else sc = true;                             cout<< ans[i][0];                     }                     else{                         int now = 1;                         int mm = ans[i].size();                         while(now < mm - 1 && ans[i][now].length() == ans[i][now + 1].length())now++;                         if(sc)putchar(' ');                         else sc = true;                         cout<< ans[i][now - 1];                     }                 }             }             putchar('\n');     }
      return 0; }
   |