hdu 4039 字符串模拟题

提交了很多次,不想多说了

第一种方法非常暴力

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int num,tot;
int cnt[2011];
int map[2011][2011];
char dic[2011][20];
struct node{
char s[20];
}ans[2011];
bool cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}
int find(char *s)
{
for(int i=1;i<=num;i++)
if(strcmp(dic[i],s)==0)
return i;
strcpy(dic[++num],s);
return num;
}
int main()
{
int t,cases=1;
int m,q;
int i,j;
char s1[20],s2[20];
scanf("%d",&t);
while(t--)
{
memset(map,0,sizeof(map));
num=0;
scanf("%d%d",&m,&q);
for(i=1;i<=m;i++)
{
scanf("%s%s",s1,s2);
int x=find(s1);
int y=find(s2);
map[x][y]=map[y][x]=1;
}
cout<<"Case "<<cases++<<":"<<endl;
while(q--)
{
tot=0;
memset(cnt,0,sizeof(cnt));
int mx=0;
scanf("%s",s1);
int z=find(s1);
for(i=1;i<=num;i++)
{
if(map[z][i]&&i!=z)
{
for(j=1;j<=num;j++)
{
if(map[i][j]&&map[z][j]==0&&z!=j)
{
cnt[j]++;
if(cnt[j]>mx)
mx=cnt[j];
}
}
}
}
if(mx==0)
printf("-");
else
{
for(i=1;i<=num;i++)
{
if(cnt[i]==mx)
{
strcpy(ans[tot++].s,dic[i]);
}
}
sort(ans,ans+tot,cmp);
printf("%s",ans[0].s);
for(i=1;i<tot;i++)
printf(" %s",ans[i].s);
}
printf("\n");
}
}
return 0;
}



  第二种方法用邻接表存储,快了许多

View Code
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int num,tot;
int cnt[2011];
vector<int> mm[2011];
char dic[2011][20];
struct node{
char s[20];
}ans[2011];
bool cmp(node a,node b)
{
return strcmp(a.s,b.s)<0;
}
int find(char *s)
{
for(int i=1;i<=num;i++)
if(strcmp(dic[i],s)==0)
return i;
strcpy(dic[++num],s);
return num;
}
int flag[2011];
int main()
{
int t,cases=1;
int m,q;
int i,j;
char s1[20],s2[20];
scanf("%d",&t);
while(t--)
{
for(i=0;i<=2010;i++)
mm[i].clear();
num=0;
scanf("%d%d",&m,&q);
for(i=1;i<=m;i++)
{
scanf("%s%s",s1,s2);
int x=find(s1);
int y=find(s2);
mm[x].push_back(y);
mm[y].push_back(x);
}
cout<<"Case "<<cases++<<":"<<endl;
while(q--)
{
tot=0;
memset(cnt,0,sizeof(cnt));
int mx=0;
scanf("%s",s1);
memset(flag,0,sizeof(flag));
int z=find(s1); flag[z]=1;
for(i=0;i<mm[z].size();i++) flag[mm[z][i]]=1;
for(i=0;i<mm[z].size();i++)
{
int tmp=mm[z][i];
for(j=0;j<mm[tmp].size();j++)
{
int tt=mm[tmp][j];
if(flag[tt]==0)
{
cnt[tt]++;
if(cnt[tt]>mx)
mx=cnt[tt];
}
}
}
if(mx==0)
printf("-");
else
{
for(i=1;i<=num;i++)
{
if(cnt[i]==mx)
{
strcpy(ans[tot++].s,dic[i]);
}
}
sort(ans,ans+tot,cmp);
printf("%s",ans[0].s);
for(i=1;i<tot;i++)
printf(" %s",ans[i].s);
}
printf("\n");
}
}
return 0;
}



  

第三种方法,用字典树来找字符串,更快

 

View Code
#include<stdio.h>
#include<vector>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int num,tot;
int cnt[2011];
vector<int> mm[2011];
char dic[2011][20];
struct node{
char s[20];
}ans[2011];
class trie{
public:
int num;
trie *child[26];
trie()
{
num=0;
memset(child,0,sizeof(child));
}
}root;
int insert(char *s)
{
class trie *cur=&root;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int id=s[i]-'a';
if(!cur->child[id])
cur->child[id]=new trie;
cur=cur->child[id];
}
if(cur->num==0)
{
cur->num=++num;
strcpy(dic[num],s);
}
return cur->num;
}
bool cmp(node a,node b){
return strcmp(a.s,b.s)<0;
}
void init(trie* T)
{
int i;
for(i=0;i<26;i++)
{
if(T->child[i])
init(T->child[i]);
}
T->num=0;
for(i=0;i<26;i++)
T->child[i]=0;
}
int flag[2011];
int main()
{
int t,cases=1;
int m,q;
int i,j;
char s1[20],s2[20];
scanf("%d",&t);
while(t--)
{
for(i=0;i<=2010;i++)
mm[i].clear();
num=0;
scanf("%d%d",&m,&q);
for(i=1;i<=m;i++)
{
scanf("%s%s",s1,s2);
int x=insert(s1);
int y=insert(s2);
mm[x].push_back(y);
mm[y].push_back(x);
}
printf("Case %d:\n",cases++);
while(q--)
{
tot=0;
memset(cnt,0,sizeof(cnt));
int mx=0;
scanf("%s",s1);
memset(flag,0,sizeof(flag));
int z=insert(s1); flag[z]=1;
for(i=0;i<mm[z].size();i++) flag[mm[z][i]]=1;
for(i=0;i<mm[z].size();i++)
{
int tmp=mm[z][i];
for(j=0;j<mm[tmp].size();j++)
{
int tt=mm[tmp][j];
if(flag[tt]==0)
{
cnt[tt]++;
if(cnt[tt]>mx)
mx=cnt[tt];
}
}
}
if(mx==0)
printf("-");
else
{
for(i=1;i<=num;i++)
{
if(cnt[i]==mx)
{
strcpy(ans[tot++].s,dic[i]);
}
}
sort(ans,ans+tot,cmp);
printf("%s",ans[0].s);
for(i=1;i<tot;i++)
printf(" %s",ans[i].s);
}
printf("\n");
}
class trie* cur=&root;
init(cur);
}
return 0;
}



posted @ 2011-12-03 18:34  Because Of You  Views(366)  Comments(0Edit  收藏  举报