CF467D Fedor and Essay 建图DFS
Codeforces Round #267 (Div. 2)
CF#267D
D. Fedor and Essay
time limit per test
2 seconds memory limit per test
256 megabytes input
standard input output
standard output After you had helped Fedor to find friends in the «Call of Soldiers 3» game, he stopped studying completely. Today, the English teacher told him to prepare an essay. Fedor didn't want to prepare the essay, so he asked Alex for help. Alex came to help and wrote the essay for Fedor. But Fedor didn't like the essay at all. Now Fedor is going to change the essay using the synonym dictionary of the English language. Fedor does not want to change the meaning of the essay. So the only change he would do: change a word from essay to one of its synonyms, basing on a replacement rule from the dictionary. Fedor may perform this operation any number of times. As a result, Fedor wants to get an essay which contains as little letters «R» (the case doesn't matter) as possible. If there are multiple essays with minimum number of «R»s he wants to get the one with minimum length (length of essay is the sum of the lengths of all the words in it). Help Fedor get the required essay. Please note that in this problem the case of letters doesn't matter. For example, if the synonym dictionary says that word cat can be replaced with word DOG, then it is allowed to replace the word Cat with the word doG. Input
The first line contains a single integer m (1 ≤ m ≤ 105) — the number of words in the initial essay. The second line contains words of the essay. The words are separated by a single space. It is guaranteed that the total length of the words won't exceed 105 characters. The next line contains a single integer n (0 ≤ n ≤ 105) — the number of pairs of words in synonym dictionary. The i-th of the next n lines contains two space-separated non-empty words xi and yi. They mean that word xi can be replaced with word yi (but not vise versa). It is guaranteed that the total length of all pairs of synonyms doesn't exceed 5·105 characters. All the words at input can only consist of uppercase and lowercase letters of the English alphabet. Output
Print two integers — the minimum number of letters «R» in an optimal essay and the minimum length of an optimal essay. Sample test(s)
Input
Output
Input
Output
|
题意:
给出m个单词,表示原文章。给出由n组单词组成的同义词字典,每组单词表示左边的可以换成右边的(单向)。(大小写均不敏感)。可以对原文章的各个单词进行若干次换,最后要得到字母“r”最少。若字母r数量相同,则要求总长度最短的(总长度为各个单词的长度和)。输出最后字母r的数量和总长度。
题解:
STLmap+建图+dfs
思路是把一个词向r尽量少、r相同的话长度尽量少的词变,于是可以对字典建个图,将能到达r最少的长度最短的点x的点全部标为换为x。
利用map将字典中的词与图中的点对应,将一组词的右边词向左边词连一条边(表示右边词有一条来自左边词的入边)。
将点按要求排序(r少的在前面,r相同的话长度小的在前面)。
然后依次对排序后的点进行dfs,所经之点的to[x]全部标为这次dfs的起点aim,只经过to[x]还没确定的点。
最后对原文章进行搞,如果原文章的某个词在字典里,就把它变成to[x]指向的词;否则不能换。
注意因为替换操作,会超int……
代码:
- //#pragma comment(linker, "/STACK:102400000,102400000")
- #include<cstdio>
- #include<cmath>
- #include<iostream>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #include<map>
- #include<set>
- #include<stack>
- #include<queue>
- using namespace std;
- #define ll long long
- #define usll unsigned ll
- #define mz(array) memset(array, 0, sizeof(array))
- #define mf1(array) memset(array, -1, sizeof(array))
- #define minf(array) memset(array, 0x3f, sizeof(array))
- #define REP(i,n) for(i=0;i<(n);i++)
- #define FOR(i,x,n) for(i=(x);i<=(n);i++)
- #define RD(x) scanf("%d",&x)
- #define RD2(x,y) scanf("%d%d",&x,&y)
- #define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
- #define WN(x) printf("%d\n",x);
- #define RE freopen("D.in","r",stdin)
- #define WE freopen("1biao.out","w",stdout)
- #define mp make_pair
- #define pb push_back
- const double eps=1e-;
- const double pi=acos(-1.0);
- const int maxn=;
- const int maxm=maxn;
- struct Edge {
- int v,next;
- } e[maxm];
- int en=;
- int head[maxn];
- void add(int x,int y) {
- e[en].v=y;
- e[en].next=head[x];
- head[x]=en++;
- }
- struct Node {
- int r,len,no;
- };
- bool operator<(const Node &x,const Node &y) {
- if(x.r<y.r)return ;
- if(x.r>y.r)return ;
- return x.len<y.len;
- }
- int to[maxn];
- int aim;
- void dfs(int x){
- to[x]=aim;
- for(int i=head[x];i!=-;i=e[i].next){
- if(to[e[i].v]==) dfs(e[i].v);
- }
- }
- int m,n;
- string s[];
- map<string,int>S;
- Node a[maxn];
- int cnt=;
- int main() {
- int i,j,k;
- string x[];
- mf1(head);
- en=;
- cin>>m;
- REP(i,m)cin>>s[i];
- cin>>n;
- REP(i,n) {
- cin>>x[]>>x[];
- REP(j,) {
- transform(x[j].begin(), x[j].end(), x[j].begin(), ::tolower);
- if(S[x[j]]==) {
- S[x[j]]=++cnt;
- int t=;
- int size=x[j].size();
- REP(k,size)if(x[j][k]=='r')t++;
- a[cnt].r=t;
- a[cnt].len=size;
- a[cnt].no=cnt;
- }
- }
- add(S[x[]],S[x[]]);
- }
- sort(a+,a+cnt+);
- mz(to);
- FOR(i,,cnt){
- if(to[a[i].no])continue;
- aim=i;
- dfs(a[i].no);
- }
- ll ans1=,ans2=;
- REP(i,m){
- transform(s[i].begin(), s[i].end(), s[i].begin(), ::tolower);
- int x=S[s[i]];
- if(x== || to[x]==){
- int t=;
- int size=s[i].length();
- REP(k,size)if(s[i][k]=='r')t++;
- ans1+=t;
- ans2+=size;
- }else{
- ans1+=a[to[x]].r;
- ans2+=a[to[x]].len;
- }
- //cout<<s[i]<<endl;
- //printf("%d %d %d %d %d\n",i,x,to[x],ans1,ans2);
- }
- printf("%I64d %I64d\n",ans1,ans2);
- return ;
- }
CF467D Fedor and Essay 建图DFS的更多相关文章
- CodeForces 467D(267Div2-D)Fedor and Essay (排序+dfs)
D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- [CF467D] Fedor and Essay
After you had helped Fedor to find friends in the «Call of Soldiers 3» game, he stopped studying com ...
- zzulioj--1831-- 周末出游(vector建图+dfs)
1831: 周末出游 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 22 Solved: 8 SubmitStatusWeb Board Descr ...
- Codeforces Round #580 (Div. 2)-D. Shortest Cycle(思维建图+dfs找最小环)
You are given nn integer numbers a1,a2,…,ana1,a2,…,an. Consider graph on nn nodes, in which nodes ii ...
- Codeforces Round #267 Div.2 D Fedor and Essay -- 强连通 DFS
题意:给一篇文章,再给一些单词替换关系a b,表示单词a可被b替换,可多次替换,问最后把这篇文章替换后(或不替换)能达到的最小的'r'的个数是多少,如果'r'的个数相等,那么尽量是文章最短. 解法:易 ...
- 7月13日考试 题解(DFS序+期望+线段树优化建图)
T1 sign 题目大意:给出一棵 N 个节点的树,求所有起点为叶节点的有向路径,其 上每一条边权值和的和.N<=10000 水题.考试的时候毒瘤出题人(学长orz)把读入顺序改了一下,于是很多 ...
- 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流
1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 388 Solved: 212[Submit ...
- UVa 3487 & 蜜汁建图
题意: 有两家公司都想向政府申请某些资源的使用权,并且他们都提供了一些申请列表,列表中含有申请费用和资源种类,同一家公司的申请列表之间不含有重复的资源.政府只可以完整地接受和拒绝谋一份申请列表,问政府 ...
- BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 1593 Solved: 967 [Submit][Statu ...
随机推荐
- qt 使用非系统字库
之前的做法都是把 ttc, ttf 这些文件拷贝到系统字库里去(即拷贝到 lib/fonts 下).但是,每次添加字体,我都要把产品的文件系统都给升级一遍吗?这样系统的一致性就不大好了.所以想能不能直 ...
- Hackerrank Going to the Office
传送门 Problem Statement Ms.Kox enjoys her job, but she does not like to waste extra time traveling to ...
- PHPstorm激活
最近想学习一下PHP 于是下载了很不错的phpstorm 但这老外的工具是要购买正版的 所以就搜了一下破解激活的教程 发现现在网上的在线破解在2016.2版本里面大多已被封杀 尝试了本地破解也发现大 ...
- Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- linux下history命令显示历史指令记录的使用方法
Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中.默认保存1000条,你也可以更改这个值 ...
- chrome断点调试
chrome断点调试 在编写JavaScript代码时,如果出现了bug,就要不断的去找错误,如果console控制台中提示还好说,可是没有提示恐怕就要费一番周折了.但是有了chrome这个浏览器,我 ...
- js007-函数表达式
js007-函数表达式 本章内容 1.函数表达式的特征 2.使用函数实现递归 3.使用闭包定义私有量 定义函数的方式有两种:一:函数声明,二:函数表达式 函数声明: function function ...
- MFC学习-第一课 MFC运行机制
最近由于兴趣爱好,学习了孙鑫的MFC教程的第一课.看完视频了,自己便用visual studio 2010尝试了MFC编程,其中遇到了一些问题. 1.vs2010不像vs6.0那样可以新建一个空的MF ...
- JQuery------$.getJSON()方法的使用
html(../Home/Index.cshtml) <body> <button class="Btn">按钮</button> </b ...
- Java反射机制<2>
反射机制还可以调用类中的指定方法或指定属性,并且可以通过反射完成对数组的操作. 通过反射调用类中的方法 import java.lang.reflect.Method; //============= ...