• 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 }
  • 相关阅读:
    Burpsuite intruder模块 越过token进行爆破,包含靶场搭建
    burpsuiteb windows10 下载与安装
    sqlmap的命令总结
    Vue.js与jQuery混用
    IE低版本cors跨域请求
    window.open打开网址被拦截
    一图一知之python3数据类型
    一图一知-vue强大的slot
    一图一知-强大的js数组
    windows中git输错密码后不能修改问题
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/6973369.html
Copyright © 2020-2023  润新知