http://poj.org/problem?id=3867
题意:就是要找一个字符串集合,这个集合里面的字符串是原字符串的最多的子串集合构成的。
按照原案例也就是
3 5
A
ACM
ICPC
CONTEST
NEERC
而答案是
C 是其中4个字符串的子串
CN是两个字符串的子串
E是两个字符串的子串
注意这里的子串不能包括自己,所以A是不行的
还有CE也是可以的,也是两个字符串的子串,这个题是个特判
思路:枚举字符串,用一个优先队列来进行维护就可以了
1 #include <stdio.h> 2 #include <string> 3 #include <string.h> 4 #include <map> 5 #include "iostream" 6 #include <queue> 7 using namespace std; 8 int m, n; 9 int num[1005][30]; 10 map<string, int>s; 11 string str[1005]; 12 13 struct MyStruct 14 { 15 int num; 16 string str; 17 MyStruct() {}; 18 MyStruct(string str, int num) :str(str), num(num) {}; 19 bool operator < (const MyStruct &a) const{ 20 return num < a.num; 21 } 22 }; 23 24 25 priority_queue<MyStruct>q; 26 27 void dfs(string a) 28 { 29 for (int i = 0; i < 26; i++) 30 { 31 string tmp = a; 32 tmp += i + ‘A‘; 33 if (s[tmp]) 34 { 35 dfs(tmp); 36 continue; 37 } 38 int tnum[26] = {0}, ans = 0; 39 for (int j = 0; j < tmp.length(); j++) 40 tnum[tmp[j] - ‘A‘]++; 41 for (int j = 1; j <= m; j++) 42 { 43 int flag = 1; 44 for(int k = 0;k<26;k++) 45 if (num[j][k] < tnum[k]) 46 { 47 flag = 0; 48 break; 49 } 50 ans += flag; 51 } 52 q.push(MyStruct(tmp, ans)); 53 } 54 } 55 56 57 int main() 58 { 59 // freopen("in.txt","r",stdin); 60 freopen("funny.in","r",stdin); 61 freopen("funny.out","w",stdout); 62 cin >> n >> m; 63 for (int i = 1; i <= m; i++) 64 { 65 cin >> str[i]; 66 s[str[i]] = i; 67 for (int j = 0; j < str[i].length(); j++) 68 num[i][str[i][j] - ‘A‘]++; 69 } 70 dfs(""); 71 int cnt = 0; 72 while (!q.empty() && cnt++ < n) 73 { 74 MyStruct st = q.top(); 75 q.pop(); 76 cout << st.str << endl; 77 dfs(st.str); 78 } 79 return 0; 80 }
时间: 2024-10-13 11:34:01