太难受,用map就直接出来了。还卡了,绝了。。
Mahmoud 想给他的朋友 Ehab 发送一条消息。他们的语言由从1到n编号的n 个单词组成。有些词具有相同的含义,因此有k组词,使得某个组中的所有词都具有相同的含义。
Mahmoud 知道第i个字可以以成本a i发送。对于信息中的每个词,Mahmoud 可以用另一个具有相同含义的词替换它,也可以保持原样。你能帮助 Mahmoud 确定发送消息的最低成本吗?
发送消息的成本是发送消息中每个单词的成本之和。
输入
输入的第一行包含整数n、k和m (1 ≤ k ≤ n ≤ 10 5 , 1 ≤ m ≤ 10 5 ) — 他们语言中的词数、词组数和词数分别在 Mahmoud 的消息中。
第二行包含n个字符串,由长度不超过20的小写英文字母组成,代表单词。保证单词是不同的。
第三行包含n 个整数a 1 , a 2 , ... , a n (1 ≤ a i ≤ 10 9 )其中a i是发送第i个单词的成本。
接下来的k行描述了具有相同含义的词组。接下来的k行每行都以一个整数x (1 ≤ x ≤ n )开头,这意味着该组中有x 个单词,然后是x 个整数,表示该组中单词的索引。保证每个单词都出现在一组中。
下一行包含m 个以空格分隔的词,代表马哈茂德的信息。这些单词中的每一个都出现在语言的单词列表中。
输出
唯一的一行应该包含在用一些具有相同含义的词替换一些词(可能没有)后发送消息的最低成本。
例子
Input
5 4 4 i loser am the second 100 1 1 5 10 1 1 1 3 2 2 5 1 4 i am the second
Output
107
Input
5 4 4 i loser am the second 100 20 1 5 10 1 1 1 3 2 2 5 1 4 i am the second
Output
116
笔记
在第一个样本中,Mahmoud 应将“第二个”一词替换为“失败者”一词,因为它的成本较低,因此成本为 100+1+5+1=107。
在第二个示例中,Mahmoud 不应进行任何替换,因此成本为 100+1+5+10=116。
赞助
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a[100010],b[100010],c[100010];
map<string,ll>st;//用map做标记就可
int main()
{
string s;
int n,m,k;
while(cin>>n>>k>>m)
{
for(int i=1;i<=n;i++)
{
cin>>s;
st[s]=i;
}
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=k;i++)
{
int x;
ll mn=INT_MAX;//神奇,比大小还可以这样·
cin>>x;
for(int j=1;j<=x;j++)
{
cin>>c[j];
mn=min(mn,a[c[j]]);
}
for(int j=1;j<=x;j++)
{
a[c[j]]=mn;
}
}
ll ans=0;
for(int i=1;i<=m;i++)
{
cin>>s;
ans+=a[st[s]];
}
cout<<ans;
}
return 0;
}