题目链接:Codeforces 467D Fedor and Essay
题目大意:给定一个含n个单词的文本,然后给定m种变换,要求变换后r的个数尽量少,长度尽量短,不区分大小写。
解题思路:bfs,将每个单词处理成长度以及r的个数,然后从最优的开始更新即可,类似dp。
#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5+5;
typedef long long ll;
typedef pair<ll, ll> pii;
int M, N, sz, W[maxn];
map<string, int> V;
vector<int> g[maxn * 3];
pii vec[maxn*3];
void add (string& s) {
ll len = s.length(), cnt = 0;
for (int j = 0; j < len; j++) {
if (s[j] >= 'A' && s[j] <= 'Z')
s[j] = s[j] - 'A' + 'a';
if (s[j] == 'r')
cnt++;
}
if (!V.count(s)) {
V[s] = sz;
vec[sz++] = make_pair(cnt, len);
}
}
void init () {
sz = 0;
string s, e;
cin >> M;
for (int i = 0; i < M; i++) {
cin >> s;
add(s);
W[i] = V[s];
}
cin >> N;
for (int i = 0; i < N; i++) {
cin >> s >> e;
add(s);
add(e);
g[V[e]].push_back(V[s]);
}
}
void solve () {
queue<int> que;
for (int i = 0; i < sz; i++)
que.push(i);
while (!que.empty()) {
int idx = que.front();
pii u = vec[idx];
que.pop();
for (int i = 0; i < g[idx].size(); i++) {
int v = g[idx][i];
if (vec[v] > u) {
vec[v] = u;
que.push(v);
}
}
}
ll len = 0, cnt = 0;
for (int i = 0; i < M; i++) {
cnt += vec[W[i]].first;
len += vec[W[i]].second;
}
cout << cnt << " " << len << endl;
}
int main () {
init();
solve();
return 0;
}
分享到:
相关推荐
Codeforces 1925D Good Trip 题解
暴枚最长桌脚的长度$l$,然后长度比$l$长的桌脚全部都要砍掉长度比$l$短的桌脚选择代价前$k$小的砍掉用线段树维护;示例程序 :typedef long l
Codeforces 题库 101-200 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
codeforces每日一题。 题意: 给出一个数组,让你挑选出能组成任意pair差值为2的幂的序列,并且使这个序列长度尽可能大。 思路: 针对于挑选出来的序列,任意pair对的差值为2的幂数。 假设有多个pair对,设dis(a,b)=2...
Codeforces 题库 001-100 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
codeforces编程网站预测分数插件
Educational Codeforces Round 157D. XOR Construction
【并查集】Codeforces 566D Restructuring Company题面在这里对于本题,只需要再维护一个并查集表示i所在联通块的最右位置因为相邻
Codeforces 1105B - Zuhair and Strings 测试点37个(全)
使用于Google Chrome的Codeforces Enhancer 1.1.2插件安装包。 版本:codeforces enhancer 1.1.2 使用浏览器:Google Chrome
Codeforces 149 D-Coloring Brackets,动态规划求解
题意: 给出 nnn 个点,n−1n-1n−1 条边,最多询问 n2\frac{n}{2}2n 次,每次询问 u,vu,vu,v,会给出 uvuvuv的最近公共祖先,求树的根。 ...操作就是一个删除叶子节点的过程。 AC代码: const int N = 1010;...
Codeforces 185A - Plant 全测试点49个
codeforces 19 E Fairy 一道比较难的题目的解题报告 推荐阅读
题目大意:给出一个由 n 个点组成的树,现在可以询问 n/2 次(向下取整)LCA,确定根节点是哪个节点 题目分析:因为最多只能求 n/2 次lca,每次需要两个节点作为参数,也就是说每个点我们至多遍历一遍,读完题后没什么...
Codeforces global round 10 codes
Codeforces round 678 division 2 codes
Some of the Codeforces problems codes
Codeforces round 678 D2_Codeforces_源码
打codeforces的神器