Codeforces Round #811 (Div. 3) D. Color with Occurrences

D. Color with Occurrences

题意:

给出一个母字符串,再给出n个子串,求能覆盖母串的子串的最少个数

题解:

是一个区间覆盖的问题,首先需要从母串中得到可以使用的子串区间。

Code:

struct node {
    int id;
    int l, r;
};
inline void _A_A_() {
    string s;
    cin >> s;
    int n;
    cin >> n;
    vector<string> v;
    for (int i = 0;i < n;i++) {
        string t;
        cin >> t;
        v.push_back(t);
    }
    vector<node> a;
    for (int i = 0;i < s.length();i++) {
        for (int k = 0;k < v.size();k++) {
            if (s.substr(i,v[k].size()) == v[k]) {
                node x;
                x.id = k + 1;
                x.l = i,
                x.r = i + v[k].size() - 1;
                a.push_back(x);
            }
        }
    }
    auto cmp = [] (node a, node b) -> bool {
        if (a.l != b.l) return a.l < b.l;
        return a.r < b.r;
    };
    sort(a.begin(),a.end(),cmp);
    int res = 0;
    int st = 0,ed = s.length() - 1;
    int sz = a.size();
    vector<int> ans;
    for (int i = 0;i < sz;i++) {
        int j =i;
        int r = -inf;
        int temp = 0;
        while (j < sz && a[j].l <= st) {
            if (a[j].r > r) {
                r = a[j].r;
                temp = j ;
            }
            j++;
        }
        if (r < st) { break;}
        ans.push_back(temp);
        if (r >= ed) {
            res = 1;
            break;
        }
        st = r + 1;
        i = j - 1;
    }
    if (res == 1){
        cout << ans.size() << "\n";
        for (auto xx : ans) {
            cout << a[xx].id << " " << a[xx].l + 1 << "\n";
        }
        return;
    }
    cout << -1 << "\n";
}
posted @   Uzhia  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示