名字的价值
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
每个人都有名字,名字都是唯一的不存在重复现象。现在假设名字都是由小写字母组成并且长度不超过10,我们赋予每个名字一个初始价值。价值是正整数并且不超过100,如果第j个人的名字是第i个人的前缀并且前缀长度最大,我们就说j是i的父节点,比如:名字A为:a;名字B为ab;名字C为abc; A是C的前缀,B也是C的前缀,但是B的长度为2比A的长度大,那么B就是C的父节点. 由此规则建树,从叶子节点到根,父节点的价值=父节点本身的价值+孩子节点的价值。 求最后各个名字的价值
输入
一个整数T,代表数据组数
对于每一组数据输入第一行为一个整数N(0<N<=10^5)代表N个名字,第二行为N个名字,第三行为N个名字的价值
名字都是唯一的
对于每一组数据输入第一行为一个整数N(0<N<=10^5)代表N个名字,第二行为N个名字,第三行为N个名字的价值
名字都是唯一的
输出
输出N个对应的名字的价值,按照输入的顺序输出(操作完成后最终价值)示例输入
1 3 a ab abc 10 20 30
示例输出
60 50 30
提示
大数据输入,建议用scanf
解题报告
一题字典数的应用。。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
struct N
{
int n;
char name[20];
int ii;
} nn[100010];
int cmp(const void *a,const void *b)
{
N * a1=(N *)a;
N * b1=(N *)b;
return strlen(a1->name)-strlen(b1->name);
}
int cmmp(const void *a,const void *b)
{
N * a1=(N *)a;
N * b1=(N *)b;
if(a1->ii>b1->ii)return 1;
return 0;
}
struct node
{
int v;
node *next[26];
};
node *newnode()
{
node *p=new node;
p->v=0;
for(int i=0; i<26; i++)
p->next[i]=NULL;
return p;
}
void insertnode(node *root,char *str,int n)//插入
{
node *p=root;
int l=strlen(str);
for(int i=0; i<l; i++)
{
int t=str[i]-'a';
p->v+=n;
if(p->next[t]==NULL)
{
p->next[t]=newnode();
}
p=p->next[t];
}
p->v=n;
}
int find(node *root,char *str)//查找
{
node *p=root;
int l=strlen(str);
for(int i=0; i<l; i++)
{
int t=str[i]-'a';
if(p->next[t]==NULL)
return 0;
p=p->next[t];
}
return p->v;
}
void freenode(node *root)
{
node *p=root;
for(int i=0; i<26; i++)
if(p->next[i]!=NULL)
freenode(p->next[i]);
delete p;
}
int main()
{
int t,n,i,j;
scanf("%d",&t);
while(t--)
{
node *root=newnode();
scanf("%d",&n);
memset(nn,0,sizeof(nn));
for(i=0; i<n; i++)
{
scanf("%s",nn[i].name);
nn[i].ii=i;
}
for(i=0; i<n; i++)
scanf("%d",&nn[i].n);
qsort(nn,n,sizeof(nn[0]),cmp);
for(i=0; i<n; i++)
{
insertnode(root,nn[i].name,nn[i].n);
}
qsort(nn,n,sizeof(nn[0]),cmmp);
for(i=0; i<n; i++)
{
printf("%d",find(root,nn[i].name));
if(i!=n-1)printf(" ");
else printf("\n");
}
freenode(root);
}
}
/**************************************
Problem id : SDUT OJ 2806
User name : acm2013叶思俊
Result : Accepted
Take Memory : 47508K
Take Time : 160MS
Submit Time : 2014-02-22 14:06:33
**************************************/
超了两次内存了。。。虽然AC。。。