POJ1451 T9 题解&代码

来源:互联网 发布:kik是什么软件 编辑:程序博客网 时间:2024/04/26 11:10

第一次写Trie树我居然1A了【不,不要算某个PE
Trie树模板级别的题【哪里模板了
对于每组数据的dictionary建立一个字典树,然后dfs查询,用数组保存离线的一个询问里的length-1个输出

#include<iostream>#include<stdio.h>#include<string.h>#define clr(x) memset(x,0,sizeof(x))using namespace std;const int maxl=105;const int maxn=1005;int T,n,m,value,tot,Flag[maxl],son[maxl*maxn][27],val[maxl*maxn][27],check[10][4]={{0,0,0,0},{0,0,0,0},{0,1,2,26},{3,4,5,26},{6,7,8,26},{9,10,11,26},{12,13,14,26},{15,16,17,18},{19,20,21,26},{22,23,24,25}};char s[maxl],ans[maxl][maxl],t[maxl],fal[]="MANUALLY";void newnode(int x,int temp,int v){    //cout<<tot<<' '<<val[x][temp]<<' '<<v<<endl;    if(v)son[x][temp]=++tot;    else son[x][temp]=0;    val[x][temp]=v;    for(int i=0;i<26;i++)        son[tot][i]=0,val[tot][i]=0;}void Insert(int v){    int len=strlen(s),p=0,x=0,temp;    while(p!=len)    {        temp=s[p]-'a';        //cout<<temp<<' '<<son[x][temp]<<endl;        if(son[x][temp])val[x][temp]+=v;        else newnode(x,temp,v);        x=son[x][temp];        p++;    }}void query(int p,int now){    if(p==strlen(s)-1)return;    for(int i=0;i<4;i++)        if(son[now][check[s[p]-'0'][i]])        {            t[p]=check[s[p]-'0'][i]+'a';            t[p+1]='\0';            if((!Flag[p]) || val[now][check[s[p]-'0'][i]]>Flag[p])            {                Flag[p]=val[now][check[s[p]-'0'][i]],strcpy(ans[p],t);                //printf("%d %d %s\n",p,val[now][check[s[p]-'0'][i]],ans[p]);            }            query(p+1,son[now][check[s[p]-'0'][i]]);        }}int main(void){    scanf("%d",&T);    for(int i=1;i<=T;i++)    {        printf("Scenario #%d:\n",i);        tot=0;        newnode(0,0,0);        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%s%d",s,&value);            Insert(value);        }        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%s",s);            clr(Flag);            query(0,0);            int len=strlen(s);            for(int i=0;i<len-1;i++)                if(Flag[i])printf("%s\n",ans[i]);                else printf("%s\n",fal);            printf("\n");        }        printf("\n");    }    return 0;}
1 0
原创粉丝点击