题目链接: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 }