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.

Examples
input

Copy
3
AbRb r Zz
4
xR abRb
aA xr
zz Z
xr y
output
2 6
input

Copy
2
RuruRu fedya
1
ruruRU fedor
output
1 10
题意:给你一段有n个单词的句子,再给出m个可以以左代替右的转换(单向的),求整个句子最少有几个r和最少的字母。
分析:从题意可知我们可以用bfs遍历找出每个单词最优的情况,怎样找出最优的情况呢,我们由题意可知r和整句单词数要最少
我们就可以从每个单词中提取出r的数量cnt和每个单词的长度len。然后利用map函数中的count找出是否有一样的单词,用v[i][j]数组
记录第i个单词的可以代替第v[i][j]个单词,v[i].size()可以快捷的找出有多少个单词可由第i个单词代替,具体看代码解析。
代码:

#include<cstdio>
#include<map>
#include<vector>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<string>
#include<queue>
#define Max 100010
using namespace std;
typedef __int64 ll;
map<string,int> mp;//记录不同单词的数量
vector<int> v[Max*2];//记录第j可以换成i
int n,m,w[Max];//记录要处理的单词
int sz;
struct
{
  int len;
  int cnt;
}st[Max*3],st1;//记录每个单词的长度和r的数量
int dt(string& s)
{
  int len=s.length();
  int i;
  int cnt=0;
  for(i=0;i<len;i++)//全转换为小写字母以便处理
  {
    if(s[i]<'a')
    s[i]+='a'-'A';
    if(s[i]=='r')
    cnt++;//记录r数
  }
  if(!mp.count(s))//加入不同的单词,mp.count(s)可以查找mp中是否有和s一样的单词
  {
    //printf("sada\n");
    mp[s]=sz;//给每个单词标个号
    st[sz].cnt=cnt;
    //printf("%d %d %d\n",sz,cnt,len);
    st[sz++].len=len;
  }
return 0;
}
int bfs()
{
  queue<int> q;
  int i,j;
  for(i=0;i<sz;i++)//放入所有的单词,以便将其全部化为最优情况
  q.push(i);
  //printf("sz=%d\n",sz);
  while(!q.empty())
  {
    int a=q.front();
    q.pop();
    st1=st[a];//提取出当前编号单词的特性
    int len=v[a].size();//有多少单词可以由当前单词代替
    for(i=0;i<len;i++)
    {
      int x1=v[a][i];
      //printf("v%d",x1);
      if(st1.cnt<st[x1].cnt)//判断r的数量
      {
        st[x1].cnt=st1.cnt;
        st[x1].len=st1.len;
        q.push(x1);
      }
      else if(st1.cnt==st[x1].cnt&&st1.len<st[x1].len)//判断长度
      {
        st[x1].len=st1.len;
        q.push(x1);
      }
    }
    //printf("a%d %d\n",a,q.empty());
  }
  return 0;
}
string s1,s2;
int main()
{
  cin>>n;
  int i,j;
  for(i=0;i<n;i++)
  {
    getchar();
    cin>>s1;
    dt(s1);
    w[i]=mp[s1];//记录要处理的单词
  }
  cin>>m;
  for(i=0;i<m;i++)
  {
    cin>>s1>>s2;
    dt(s1);
    dt(s2);
    v[mp[s2]].push_back(mp[s1]);//注意:单词的转换是由左到右,单向的;
  }
  bfs();
  ll cnt=0,len=0;//小心cnt与len超过2^32(每个单词<=100000,每条语句小于100000个单词
  for(i=0;i<n;i++)//因为前面的处理已将所有单词转换为最优情况了
  {
    cnt+=st[w[i]].cnt;
    len+=st[w[i]].len;
  }
  cout<<cnt<<" "<<len;
  return 0;
}

cf467D(map,vector,bfs,特点提取)的更多相关文章

  1. UVa 11991:Easy Problem from Rujia Liu?(STL练习,map+vector)

    Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for example, ...

  2. uva--11991 - Easy Problem from Rujia Liu?(sort+二分 map+vector vector)

    11991 - Easy Problem from Rujia Liu? Though Rujia Liu usually sets hard problems for contests (for e ...

  3. map,vector 等容器内容的循环删除问题(C++)

    map,vector 等容器内容的循环删除问题(C++) map,vector等容器的循环删除不能用普通的方法删除: for(auto p=list.begin();p!=list.end();p++ ...

  4. 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)

    传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...

  5. Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】

    F. Contestants Ranking time limit per test:1 second memory limit per test:24 megabytes input:standar ...

  6. 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

    list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的.  如果我自己写,我也会用二叉检索树,它在 ...

  7. Set,List,Map,Vector,ArrayList的区别(转)

    JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtab ...

  8. ACM: NBUT 1646 Internet of Lights and Switches - 二进制+map+vector

    NBUT 1646 Internet of Lights and Switches Time Limit:5000MS     Memory Limit:65535KB     64bit IO Fo ...

  9. c++如何遍历删除map/vector里面的元素

    新技能Get! 问题 对于c++里面的容器, 我们可以使用iterator进行方便的遍历. 但是当我们通过iterator对vector/map等进行修改时, 我们就要小心了, 因为操作往往会导致it ...

随机推荐

  1. Okhttp 插入缓存拦截器 解析

    我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下 会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还 ...

  2. hadoop挂载多硬盘,ZZ-- multiple disks per node

    hadoop挂载多硬盘 ...multiple disks per node  multiple disks per node Read more at: http://www.queryhome.c ...

  3. python3-----多进程、多线程、多协程

    目前计算机程序一般会遇到两类I/O:硬盘I/O和网络I/O.我就针对网络I/O的场景分析下python3下进程.线程.协程效率的对比.进程采用multiprocessing.Pool进程池,线程是自己 ...

  4. Confluence 6 空间标识

    每一个 Confluence 空间都有一个 空间标识(space key),这个空间标识是简短并且是唯一的,这个标识被用来构建到空间的 URL 中. 当你创建一个站点空间,Confluence 将会为 ...

  5. Confluence 6 空间

    什么是一个空间? Confluence 空间是包含有页面和博客页面的容器.你也可以将空间认为是对你工作中可以使用的 2 中类型的目录. 在 Confluence 中有下面 2 种空间类型: 站点空间( ...

  6. PHP单例模式 demo

    <?php class single{ static public $db; private function __construct(){ }; static function getinst ...

  7. Vasya And The Mushrooms CodeForces - 1016C (前缀和模拟)

    大意: 给定2*n的矩阵, 每个格子有权值, 走到一个格子的贡献为之前走的步数*权值, 每个格子只能走一次, 求走完所有格子最大贡献. 沙茶模拟打了一个小时总算打出来了 #include <io ...

  8. Java对MongoDB中的数据查询处理

    Java语言标准的数据库时MySQL,但是有些时候也会用到MongoDB,这次Boss交代处理MongoDB,所以讲代码以及思路记录下了 摸索的过程,才发现软件的适用还是很重要的啊!!! 我连接的Mo ...

  9. 5月21 练习AJAX的查看详细及批量删除

    老师讲过之后的复习: 显示数据的代码部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  10. js动态修改title

    问题描述: 由于微信浏览器只在页面首次加载时初始化了标题title,之后就没有再监听 window.title的change事件.所以这里修改了title后,立即创建一个请求,加载一个空的iframe ...