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 }
时间: 2024-10-13 11:34:01

poj 3867的相关文章

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is

POJ——T2446 Chessboard

http://poj.org/problem?id=2446 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18560   Accepted: 5857 Description Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of c

poj 1088 滑雪 DP(dfs的记忆化搜索)

题目地址:http://poj.org/problem?id=1088 题目大意:给你一个m*n的矩阵 如果其中一个点高于另一个点 那么就可以从高点向下滑 直到没有可以下滑的时候 就得到一条下滑路径 求最大的下滑路径 分析:因为只能从高峰滑到低峰,无后效性,所以每个点都可以找到自己的最长下滑距离(只与自己高度有关).记忆每个点的最长下滑距离,当有另一个点的下滑路径遇到这个点的时候,直接加上这个点的最长下滑距离. dp递推式是,dp[x][y] = max(dp[x][y],dp[x+1][y]+

POJ 1385 计算几何 多边形重心

链接: http://poj.org/problem?id=1385 题意: 给你一个多边形,求它的重心 题解: 模板题,但是不知道为啥我的结果输出的确是-0.00 -0.00 所以我又写了个 if (ans.x == 0) ans.x = 0 感觉好傻逼 代码: 1 #include <map> 2 #include <set> 3 #include <cmath> 4 #include <queue> 5 #include <stack> 6

POJ 1741 Tree(树的点分治,入门题)

Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 21357   Accepted: 7006 Description Give a tree with n vertices,each edge has a length(positive integer less than 1001).Define dist(u,v)=The min distance between node u and v.Give an in

poj 1655 树的重心

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13178   Accepted: 5565 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or m

POJ 2479 Maximum sum

http://poj.org/problem?id=2479 题意: 给出一个整数串,求连续子串1和连续子串2,不相交并且串1加串2的和最大. 思路: 其实就是求最大连续和,题意要求就是求两段最大连续和.我们可以从左边和右边分别求最大连续和,代码中的dp_l[i]就是1~i的最大连续和,dp_r[i]则是i~n的最大连续和. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<