USACO--1.2Name That Number

题意还是很简单的,我们可以用dfs穷举出所有可能的名字;重要的是查询名字是不是合法,开始的时候用的map,没想到超时了;于是后面用的字典树,其实应该也可以用二分进行查找。另外好像USACO对内存限制很严,数组不能开太大。

代码如下:

/*
ID: 15674811
LANG: C++
TASK: namenum
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;

ofstream fout("namenum.out");
ifstream fin("namenum.in");
//ifstream fin("lkl.txt");

typedef struct
{
    int ch[26];
    int flag;
}N;
N node[50000];
int top;

void Insert(char *str)
{
    int len=strlen(str);
    int t=0;
    for(int i=0;i<len;i++)
    {
        if(node[t].ch[str[i]-‘A‘]==0)
            node[t].ch[str[i]-‘A‘]=++top;
        t=node[t].ch[str[i]-‘A‘];
    }
    node[t].flag=1;
}

int query(char *str)
{
    int len=strlen(str);
    int t=0;
    for(int i=0;i<len;i++)
    {
        if(node[t].ch[str[i]-‘A‘]==0)
            return 0;
        t=node[t].ch[str[i]-‘A‘];
    }
    if(node[t].flag)
        return 1;
    return 0;
}

int flag;
char str[20];
char tmp[20][10];
char ans[20];
int len;

void dfs(int cnt)
{
    if(cnt==len)
    {
        ans[cnt]=‘\0‘;
        if(query(ans))
        {
           fout<<ans<<endl;
           flag=1;
        }
        return ;
    }
    for(int i=1;i<=3;i++)
    {
        ans[cnt]=tmp[str[cnt]-‘0‘][i];
        dfs(cnt+1);
    }
}

int main()
{
    int k=0;
    for(int i=2;i<=9;i++)
        for(int j=1;j<=3;j++)
        {
            tmp[i][j]=‘A‘+k;
            if(tmp[i][j]==‘Q‘)
                tmp[i][j]=‘A‘+(++k);
            k++;
        }
    memset(node,0,sizeof(node));
    top=0;
    ifstream fin1("dict.txt");
    while(fin1>>str)
    {
        Insert(str);
    }
    while(fin>>str)
    {
        flag=0;
        len=strlen(str);
        dfs(0);
        if(flag==0)
            fout<<"NONE"<<endl;
    }
  return 0;
}
时间: 2024-10-21 14:54:59

USACO--1.2Name That Number的相关文章

【USACO】name that number

{ ID: anniel11 PROG: namenum LANG: PASCAL } Program namenum; var i,n,l:integer; s,s2:string; dicl:array[1..12] of integer; dic:array[1..12,1..2000] of integer; function transs(c:char):string; var trans:integer; begin case c of 'A','B','C':trans:=2; '

USACO Section1.2 Name That Number 解题报告

namenum解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 你有一个手机,键盘如下所示: 2: A,B,C 5: J,K,L 8: T,U,V 3: D,E,F 6: M,N,O 9:

USACO 1.5 Number Triangles

Number Triangles Consider the number triangle shown below. Write a program that calculates the highest sum of numbers that can be passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the

USACO 1.2 Name That Number

Name That Number Among the large Wisconsin cattle ranchers, it is customary to brand cows with serial numbers to please the Accounting Department. The cow hands don't appreciate the advantage of this filing system, though, and wish to call the member

USACO Name That Number(File)

题目请点我 题解: 题目应该不难理解,就是找出数字对应字典中的字符串.因为数字对字符是一对多的关系,所以输入的数字可能对应多个答案.如果每次都要一一对比查找的话显然太浪费时间.转换思路,对于字典中的字符串,他们都有自己唯一对应的数值,我们只需一次遍历,就能将他们全部转化,剩下的共作就是每次对比数值,输出对应字符串了. PS:这道题在输入上坑了很久,原因在于%I64d 和 %lld ,用%I64d错在第三组,但是%lld是可以的.在网上查的资料也并没有很清楚之间的区别,但是如果用cin的话就不会遇

USACO Section1.5 Number Triangles 解题报告

numtri解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有一个数字的金字塔,形状如下    7   3 8  8 1 0 2 7 4 4 4 5 2 6 5 要从顶端开始走,每次只能向

usaco Number Triangles

数字三角形,最简单的dp之一. 不过这次尝试了下滚动数组. /* ID: modengd1 PROG: numtri LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int dp[2][1000],input[1001]; int main() { freopen("numtri.in","r"

usaco Name That Number

为什么要使用如此反人类的输入方式. /* ID: modengd1 PROG: namenum LANG: C++ */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *in = fopen ("namenum.in", "r"); FILE *in2 = fopen ("dict.txt", "

【BZOJ】【1662】/【POJ】【3252】 【USACO 2006 Nov】Round Number

数位DP 同上一题Windy数 预处理求个组合数 然后同样的方法,这次是记录一下0和1的个数然后搞搞 Orz cxlove 1 /************************************************************** 2 Problem: 1662 3 User: Tunix 4 Language: C++ 5 Result: Accepted 6 Time:0 ms 7 Memory:1280 kb 8 **************************