http://acm.hnu.cn/online/?action=problem&type=show&id=13352
题意:给你两组字符串,每组有100000个,对于每一种字符串计算两组里面的较小值,然后输出所有不同字符串较小值的和。
该题本是用字典树知识ac的,但我用map给糊里糊涂ac了。
tree
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct NODE
{
NODE *next[26];
int k;
NODE (){
for(int i=0;i<26;i++)
next[i]=NULL;
k=0;
}
};
struct NODE *root;
void inset(char s[])
{
NODE *p=root;
int i=0;
while(s[i]!='\0')
{
if(p->next[s[i]-'a']==NULL)
{
p->next[s[i]-'a']=new NODE;
}
p=p->next[s[i]-'a'];
i++;
}
(p->k)++;
}
int query(char s[])
{
NODE *p=root;
int i=0;
while(s[i]!='\0'&&p->next[s[i]-'a']!=NULL)
{
p=p->next[s[i]-'a'];
i++;
}
if(s[i]=='\0')
{
p->k--;
if(p->k>=0)
return 1;
}
return 0;
}
int main()
{
int n;
char s[20];
while(scanf("%d",&n)>0)
{
root=new NODE();
for(int i=0; i<n; i++)
{
scanf("%s",s);
//printf("%s",s);
inset(s);
}
int ans=0;
while(n--)
{
scanf("%s",s);
ans+=query(s);
}
printf("%d\n",ans);
}
}
map 开始我是用两个map,果然TLE,改成一个ac
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
int str[1];
int str1[110];
char s[100];
char st[100010][110];
struct node
{
int x;
int y;
};
map<string,node> ma;
map<string,node > ::iterator it;
int main()
{
int i,j,k,ans,n,m;
while(scanf("%d",&n)!=EOF)
{
ma.clear();
ans=0;
for(i=0;i<n;i++)
{
//cin>>s;
scanf("%s",s);
++ma[s].x;
}
for(i=0;i<n;i++)
{
scanf("%s",s);
++ma[s].y;
}
for(it=ma.begin();it!=ma.end();it++)
{
ans+=min(it->second.x,it->second.y);
}
// for(i=0;i<n;i++)
// {
// if(v.find(st[i])==v.end())
// {
// v[st[i]]=1;
// ans+=min(ma[st[i]],ma1[st[i]]);
// }
// }
printf("%d\n",ans);
}
}