记录编号 33390 评测结果 AAAAAAAAAA
题目名称 韩国明星 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.882 s
提交时间 2011-11-10 15:11:52 内存使用 10.95 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int N,K;

const int sonnum=127;
const char base=0; 
struct Trie 
{ 
    bool isStr;
	int Num;
    struct Trie *son[sonnum];
}; 

Trie *Tree;
int Suki[100001];

class NUM
{
public:
	int n;
	int Suki;
	char str[100];
	NUM()
	{
		Suki=0;
	}
}Su[100001];

int top=0;

Trie *NewTrie()
{ 
    Trie *temp=new Trie; 
    temp->isStr=false; 
	temp->Num=0;
    for (int i=0;i<sonnum;i++) 
        temp->son[i]=NULL;
    return temp; 
} 

void Insert(Trie *pnt,char *s,int len)
{                              
	top++;
	Su[top].n=top;
	Su[top].Suki=0;
	for (int i=0;i<len;i++)
		Su[top].str[i]=s[i];
	
    Trie *temp=pnt; 
    for (int i=0;i<len;i++) 
    { 
        if (temp->son[s[i]-base]==NULL) 
            temp->son[s[i]-base]=NewTrie(); 
        temp=temp->son[s[i]-base]; 
    } 
    temp->isStr=true; 
	temp->Num=top;
} 

void check(Trie *pnt,char *s,int len,int change) 
{ 
    Trie *temp=pnt; 
    for (int i=0;i<len;i++) 
		temp=temp->son[s[i]-base]; 
    Su[temp->Num].Suki+=change; 
} 

int cmp(const void *a,const void *b)
{
	class NUM *c=(class NUM *)a;
	class NUM *d=(class NUM *)b;
	return d->Suki-c->Suki;
	return 0;
}

void init()
{
	Tree=NewTrie();
	char str[100];
	scanf("%d\n",&N);
	for (int i=1;i<=N;i++)
	{
		memset(str,'\0',sizeof(str));
		scanf("%[^\n]\n",&str);
		Insert(Tree,str,strlen(str));
	}
	scanf("%d\n",&K);
	int tmp;
	for (int i=1;i<=K;i++)
	{
		memset(str,'\0',sizeof(str));
		scanf("%[^\n]\n",&str);
		scanf("%d\n",&tmp);
		check(Tree,str,strlen(str),tmp);
	}
	qsort(Su+1,top,sizeof(Su[0]),cmp);
	
	for (int i=1;i<=top;i++)
	{
		printf("%s\n%d\n",Su[i].str,Su[i].Suki);
	}
}

int main()
{
	freopen("star.in","r",stdin);
	freopen("star.out","w",stdout);
	init();
	return 0;
}