[POJ1598]Excuses, Excuses!(模拟)

题目链接:http://poj.org/problem?id=1598

题意:给一个词典,然后给一些字符串,问这些字符串里出现多少次词典中出现的词,输出包含最多的字符串(可有多个)。

简单模拟,练手

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <iomanip>
 4 #include <cstring>
 5 #include <climits>
 6 #include <complex>
 7 #include <cassert>
 8 #include <cstdio>
 9 #include <bitset>
10 #include <vector>
11 #include <deque>
12 #include <queue>
13 #include <stack>
14 #include <ctime>
15 #include <set>
16 #include <map>
17 #include <cmath>
18 using namespace std;
19 
20 const int maxn = 55;
21 const int maxm = 88;
22 
23 int k, e;
24 set<string> ex;
25 vector<pair<string, string> > s;
26 int vis[maxn], ret;
27 char tmp[maxm], buf[maxm];
28 
29 void gao(string cur, int pos) {
30     int tt = 0;
31     int l = 0, r = 0;
32     while(r < cur.length()) {
33         while(cur[r] == ' ') r++;
34         l = r;
35         while(cur[r] != ' ' && r < cur.length()) r++;
36         int p = 0;
37         memset(buf, 0, sizeof(buf));
38         for(int i = l; i < r; i++) buf[p++] = cur[i];
39         if(ex.find(buf) != ex.end()) tt++;
40         l = r;
41     }
42     vis[pos] = tt;
43     if(ret < tt) ret = tt;
44 }
45 
46 int main() {
47     // freopen("in", "r", stdin);
48     int _ = 1;
49     while(~scanf("%d%d",&k,&e)) {
50         ex.clear(); s.clear();
51         for(int i = 0; i < k; i++) {
52             scanf("%s", tmp);
53             ex.insert(tmp);
54         }
55         getchar();
56         for(int i = 0; i < e; i++) {
57             gets(tmp);
58             memset(buf, 0, sizeof(buf));
59             int p = 0;
60             for(int j = 0; tmp[j]; j++) {
61                 if(tmp[j] >= 'A' && tmp[j] <= 'Z') buf[p++] = tmp[j] - 'A' + 'a';
62                 else if(!(tmp[j] >= 'a' && tmp[j] <= 'z')) buf[p++] = ' ';
63                 else buf[p++] = tmp[j];
64             }
65             s.push_back(pair<string, string>(tmp, buf));
66         }
67         memset(vis, 0, sizeof(vis));
68         ret = 0;
69         for(int i = 0; i < e; i++) gao(s[i].second, i);
70         printf("Excuse Set #%d
", _++);
71         for(int i = 0; i < e; i++) {
72             if(vis[i] == ret) cout << s[i].first << endl;
73         }
74         printf("
");
75     }
76     return 0;
77 }
原文地址:https://www.cnblogs.com/kirai/p/6437995.html