题目地址:http://acm.sgu.ru/problem.php?contest=0&problem=551
比较坑的题目。
只需要按照字符串排序。 然后枚举所有key的组合情况,把多个字符串拼接成一个长字符串,然后map++。
一开始觉得map花费的时间太高,所以我用的是字典树记录,结果爆内存,MLE到屎。。。 空间复杂度算搓了。
比赛结束之后也没过。 后来问phk,发现他就是用map过的。。。
好吧,map空间确实少。。。 重新写了一下,10分钟就敲完了。。 1A。。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#include<string>
using namespace std;
map<string,int>mp;
string s[4];
int rec[5];
void mj(int k)
{
int i,j,e,n;
string tmp;
n=1<<k;
for(i=1;i<n;i++)
{
tmp="";
for(j=0;j<k;j++)
{
if(i&(1<<j))
{
tmp=tmp+s[j]+"+";
}
}
mp[tmp]++;
}
}
int main()
{
int i,n,k;
string tmp;
cin>>n;
while(n--)
{
cin>>k;
for(i=0;i<k;i++)
{
cin>>s[i];
}
sort(s,s+k);
mj(k);
}
cin>>n;
while(n--)
{
cin>>k;
tmp="";
for(i=0;i<k;i++)
{
cin>>s[i];
}
sort(s,s+k);
for(i=0;i<k;i++)
{
tmp=tmp+s[i]+"+";
}
printf("%d\n",mp[tmp]);
}
return 0;
}