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
3
AbRb r Zz
4
xR abRb
aA xr
zz Z
xr y
output
2 6
input
2
RuruRu fedya
1
ruruRU fedor
output
1 10

题意:给你n个字符串,你可以把字符串转换成另外的一个,需要求使得‘R’数量最小的字符串,求‘R‘最小的数量,同样数量求最小的长度;

   m个转换,两个字符串 a,b;指可以单向传递;不区分大小写;

思路:有向图,环找出来,找这个环最小的’R‘,R相同,长度小;

   形成无环DAG,在dfs找可以转换的最小的'R’;

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
#include<bitset>
#include<time.h>
using namespace std;
#define LL long long
#define pi (4*atan(1.0))
#define eps 1e-4
#define bug(x) cout<<"bug"<<x<<endl;
const int N=1e5+,M=1e6+,inf=1e9+,MOD=1e9+;
const LL INF=1e18+,mod=1e9+; struct is
{
int u,v;
int next;
}edge[N];
int head[N];
int belong[N];
int dfn[N];
int low[N];
int stackk[N];
int instack[N];
int number[N];
int jiedge,lu,bel,top; int tot,r[N],l[N];
pair<int,int>f[N];
void update(int u,int v)
{
jiedge++;
edge[jiedge].u=u;
edge[jiedge].v=v;
edge[jiedge].next=head[u];
head[u]=jiedge;
}
void dfs(int x)
{
dfn[x]=low[x]=++lu;
stackk[++top]=x;
instack[x]=;
for(int i=head[x];i;i=edge[i].next)
{
if(!dfn[edge[i].v])
{
dfs(edge[i].v);
low[x]=min(low[x],low[edge[i].v]);
}
else if(instack[edge[i].v])
low[x]=min(low[x],dfn[edge[i].v]);
}
if(low[x]==dfn[x])
{
int sum=;
bel++;
int ne,r1=inf,l1=inf;
do
{
sum++;
ne=stackk[top--];
if(r[ne]<r1)
{
r1=r[ne];
l1=l[ne];
}
else if(r[ne]==r1)
l1=min(l1,l[ne]);
belong[ne]=bel;
instack[ne]=;
}while(x!=ne);
f[bel]=make_pair(r1,l1);
number[bel]=sum;
}
}
void tarjan()
{
memset(dfn,,sizeof(dfn));
bel=lu=top=;
for(int i=;i<=tot;i++)
if(!dfn[i])
dfs(i);
} vector<int> edge2[N];
int vis2[N];
void dfs2(int u,int fa)
{
for(int i=;i<edge2[u].size();i++)
{
int v=edge2[u][i];
if(v==fa)continue;
dfs2(v,u);
if(f[u].first>f[v].first)
f[u]=f[v];
else if(f[u].first==f[v].first&&f[u].second>f[v].second)
f[u]=f[v];
}
}
string s[N];
map<string,int>mp;
int si[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
cin>>s[i];
int ri=;
for(int j=;j<s[i].size();j++)
{
if(s[i][j]>='A'&&s[i][j]<='Z')
s[i][j]=s[i][j]-'A'+'a';
if(s[i][j]=='r')ri++;
}
si[i]=ri;
}
int m;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
string a,b;
cin>>a>>b;
int ri=;
for(int j=;j<a.size();j++)
{
if(a[j]>='A'&&a[j]<='Z')
a[j]=a[j]-'A'+'a';
if(a[j]=='r')ri++;
}
if(mp.find(a)==mp.end())mp[a]=++tot;
r[mp[a]]=ri;l[mp[a]]=a.size();
ri=;
for(int j=;j<b.size();j++)
{
if(b[j]>='A'&&b[j]<='Z')
b[j]=b[j]-'A'+'a';
if(b[j]=='r')ri++;
}
if(mp.find(b)==mp.end())mp[b]=++tot;
r[mp[b]]=ri;l[mp[b]]=b.size();
update(mp[a],mp[b]);
}
tarjan();
memset(head,,sizeof(head));
for(int i=;i<=jiedge;i++)
{
if(belong[edge[i].u]!=belong[edge[i].v])
{
edge2[belong[edge[i].u]].push_back(belong[edge[i].v]);
vis2[belong[edge[i].v]]=;
}
}
//for(int i=1;i<=tot;i++)
//cout<<belong[i]<<endl;
//cout<<bel<<endl;
for(int i=;i<=bel;i++)
if(!vis2[i])
dfs2(i,-);
LL ans=,out=;
for(int i=;i<=n;i++)
{
if(mp.find(s[i])==mp.end())ans+=si[i],out+=s[i].size();
else
{
ans+=f[belong[mp[s[i]]]].first;
out+=f[belong[mp[s[i]]]].second;
}
}
printf("%lld %lld\n",ans,out);
return ;
}

Codeforces Round #267 (Div. 2) D. Fedor and Essay tarjan缩点的更多相关文章

  1. Codeforces Round #267 Div.2 D Fedor and Essay -- 强连通 DFS

    题意:给一篇文章,再给一些单词替换关系a b,表示单词a可被b替换,可多次替换,问最后把这篇文章替换后(或不替换)能达到的最小的'r'的个数是多少,如果'r'的个数相等,那么尽量是文章最短. 解法:易 ...

  2. Codeforces Round #267 (Div. 2) B. Fedor and New Game【位运算/给你m+1个数让你判断所给数的二进制形式与第m+1个数不相同的位数是不是小于等于k,是的话就累计起来】

    After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...

  3. Codeforces Round #267 (Div. 2) B. Fedor and New Game

    After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...

  4. 01背包 Codeforces Round #267 (Div. 2) C. George and Job

    题目传送门 /* 题意:选择k个m长的区间,使得总和最大 01背包:dp[i][j] 表示在i的位置选或不选[i-m+1, i]这个区间,当它是第j个区间. 01背包思想,状态转移方程:dp[i][j ...

  5. Codeforces Round #267 (Div. 2) C. George and Job(DP)补题

    Codeforces Round #267 (Div. 2) C. George and Job题目链接请点击~ The new ITone 6 has been released recently ...

  6. Codeforces Round #267 (Div. 2)D(DFS+单词hash+简单DP)

    D. Fedor and Essay time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. Codeforces Round #390 (Div. 2) D. Fedor and coupons(区间最大交集+优先队列)

    http://codeforces.com/contest/754/problem/D 题意: 给定几组区间,找k组区间,使得它们的公共交集最大. 思路: 在k组区间中,它们的公共交集=k组区间中右端 ...

  8. Codeforces Round #267 (Div. 2)

    A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  9. Codeforces Round #267 (Div. 2) C. George and Job DP

                                                  C. George and Job   The new ITone 6 has been released ...

随机推荐

  1. AtCoder Beginner Contest 044 A - 高橋君とホテルイージー / Tak and Hotels (ABC Edit)

    Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement There is a hotel with ...

  2. .NET 常用ORM之iBatis

    ibatis 一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,到后面发展的版本叫MyBatis但都是指的同一个东西.最初侧重 ...

  3. 清明 DAY2

    数论 数论是研究整数性质的东西 也就是 lim   π(x)=x/ ln x (x->无穷) 证明: ∵ p|ab ∴ ab有因子p 设 a=p1k1p2k2......prkr      b= ...

  4. laravel 数据库 - 增删查改

    //查询public function select(){ /** 数据表 CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, ...

  5. 同级div设置display:inline-block,父级div强制不换行

    同级div设置display:inline-block,父级div强制不换行 <html> <head></head> <body> <div i ...

  6. TCP 之 RST 原因分析

    5. 往一个对端已经关闭的套接字上写入数据会收到一个RST信号 1.发送端的 发送缓冲区还有数据,但接收端tcp的接收通道已关闭 2. SYN到达某端口但此端口上没有正在监听的服务器.对于UDP,当一 ...

  7. mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)

    选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 至于为什么选择sharding-jdbc而不是Mycat,可以参考知乎讨论帖子https ...

  8. python简说(十六)第三方模块安装

    安装第三模块 1.pip install xxx pip问题 1.提示没有pip命令的, 把python的安装目录. 安装目录下面的scripts目录加入到环境变量里面 2.Unknown or un ...

  9. windows安装 php-redis redis 扩展

    1.查看phpinfo(),确定要下载的扩展版本,扩展的下载地址在:https://pecl.php.net/package/redis 上图对应是是以下版本 2.把下载包里的文件放到php的ext文 ...

  10. 基础选择器,长度与颜色,标签display,嵌套关系,盒模型,盒模型布局

    css基础选择器 # *(统配选择器): 控制html, body,以及body下所有用于显示的标签 # div(标签选择器): 该标签名对应的所有该标签 # .(class选择器)(eg: .div ...