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";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App