方法1:
#include<cstring>
#include<cstdio>
using namespace std;
struct Ball
{
char color[20];
int num;
}ball[1005];
int cnt=1;
void count_num(char ch[])
{
int i;
for(i=0;i<cnt;i++)
{
if(strcmp(ch,ball[i].color)==0)//遍历结构体数组,看前面是否出现过相同的字符串
{
ball[i].num++;
return ;
}
}
if(i==cnt)
{
strcpy(ball[cnt].color,ch);
ball[cnt].num++;
cnt++;
}
}
int main()
{
int n,i;
char ch[20];
while(scanf("%d",&n)&&n)
{
for(int j=0;j<n;j++)
ball[j].num=0;
scanf("%s",ch);
strcpy(ball[0].color,ch);
ball[0].num=1;
cnt=1;
for(i=1;i<n;i++)
{
scanf("%s",ch);
count_num(ch);
}
int Max=-1;
int index=-1;
for(int i=0;i<n;i++)
{
printf("%s:%d
",ball[i].color,ball[i].num);
if(Max<ball[i].num)
{
Max=ball[i].num;
index=i;
}
}
printf("%s
",ball[index].color);
}
return 0;
}
方法2:
map容器
map<string,int> Hash
map初始化为0,如果第一个关键字Hash[string]为0,则说明该关键字第一次出现,反之,如果不为0,则说明前面出现过
#include <cstdio>
#include <map>
#include <string>
#include <iostream>
using namespace std;
map<string, int> Hash;
int par[1000005];
void init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
}
}
int Find(int x)
{
if(par[x]==x)
{
return x;
}
return par[x]=Find(par[x]);
}
void Unite(int x,int y)
{
x=Find(x);
y=Find(y);
if(x==y)
return ;
else{
par[y]=x;
}
}
int main () {
int n, a, cnt = 1;
string x, y;
scanf("%d",&n);
getchar();
init(1000005);
while (n --) {
cin>>a>>x>>y;
if (a == 0) {
if (!Hash[x]) {
Hash[x] = cnt ++;
}
if (!Hash[y]) {
Hash[y] = cnt ++;
}
Unite (Hash[x], Hash[y]);
} else {
if (!Hash[x]) {
Hash[x] = cnt ++;
}
if (!Hash[y]) {
Hash[y] = cnt ++;
}
if (Find(Hash[x]) == Find (Hash[y])) {
printf("yes
");
} else {
printf("no
");
}
}
}
return 0;
}