poj 3867
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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个我遇到过的“量子力学”级别的BUG。
· Linux系列:如何调试 malloc 的底层源码
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· Apifox不支持离线,Apipost可以!
· 历时 8 年,我冲上开源榜前 8 了!
· Trae 开发工具与使用技巧
· 通过 API 将Deepseek响应流式内容输出到前端
· 上周热点回顾(3.10-3.16)