给你一串数字(≤12个),每个数字可以对应3个字母,求生成的所有字符串里,在字典内的有哪些。

我做的时候想的是字典树(Trie 树),模拟数串生成的所有字符串,然后在字典树里查找一下。

  1. /*
  2. TASK:namenum
  3. LANG:C++
  4. */
  5. #include <iostream>
  6. #include <fstream>
  7. #include <algorithm>
  8. #include <cstdio>
  9. #include <cstring>
  10. #define ll long long
  11. #define MAX 26
  12. #define N 5001
  13. #define M 15
  14.  
  15. using namespace std;
  16. int top,trie[N*M][MAX+];
  17. int search(char s[]){
  18. int i,rt;
  19. for(rt=,i=;rt=trie[rt][s[i]-'A'];)
  20. if(!s[++i])return trie[rt][MAX];
  21. return ;
  22. }
  23. void insert(char s[]){
  24. int rt=;
  25. for(int i=;s[i];i++){
  26. int &nxt=trie[rt][s[i]-'A'];
  27. if(==nxt) nxt=++top;
  28. rt=nxt;
  29. }
  30. trie[rt][MAX]=;
  31. }
  32.  
  33. int cnt;
  34. //虽然只有3个字母,但是后面有\0,故要开到4。
  35. char ma[][]={"","","ABC","DEF","GHI","JKL","MNO","PRS","TUV","WXY"};
  36. char s[M],name[M];
  37. int dfs(int d){
  38. if(!s[d]){
  39. if(search(name)){
  40. cout<<name<<endl;
  41. return ;
  42. }
  43. return ;
  44. }
  45. int ok=;
  46. for(int i=;i<;i++){
  47. name[d]=ma[s[d]-''][i];
  48. if(dfs(d+))ok=;
  49. }
  50. return ok;
  51. }
  52. int main() {
  53. //freopen("namenum.in","r",stdin);
  54. //freopen("namenum.out","w",stdout);
  55. ifstream in("dict.txt");
  56. while(in>>s)insert(s);
  57. cin>>s;
  58. if(!dfs())cout<<"NONE"<<endl;
  59. return ;
  60. }

官方题解里说可以二分,还可以把字典全部转为数字,总共就5000个,这就是逆向思维。

  1. /*
  2. TASK:namenum
  3. LANG:C++
  4. */
  5. #include <iostream>
  6. #include <fstream>
  7. #include <algorithm>
  8. #include <cstdio>
  9. #include <cstring>
  10. #define ll long long
  11. #define MAX 26
  12. #define N 5001
  13. #define M 15
  14.  
  15. using namespace std;
  16.  
  17. char dic[N][M];
  18. int ma[MAX]={,,,,,,,,,,,,,,,,,,,,,,,,};
  19. ll num[N],tot,t;
  20. int main() {
  21. freopen("namenum.in","r",stdin);
  22. freopen("namenum.out","w",stdout);
  23. ifstream in("dict.txt");
  24. while(in>>dic[tot]){
  25. ll &ans=num[tot];
  26. for(int i=;dic[tot][i];i++)
  27. ans=ans*+ma[dic[tot][i]-'A'];
  28. tot++;
  29. }
  30. cin>>t;
  31. int ok=;
  32. for(int i=;i<tot;i++)
  33. if(num[i]==t){ok=;cout<<dic[i]<<endl;}
  34. if(!ok)cout<<"NONE"<<endl;
  35. return ;
  36. }

  

  

【USACO 1.2】Name That Number的更多相关文章

  1. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T4 过路费

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T4 过路费 题目 Description 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之 ...

  2. 【Usaco 2009 Gold】JZOJ2020年9月19日提高B组T3 头晕的奶牛

    [Usaco 2009 Gold]JZOJ2020年9月19日提高B组T3 头晕的奶牛 题目 Description 奶牛们发现,在农场里面赛跑是很有趣的一件事.可是她们一旦在农场里面不断地转圈,就会 ...

  3. 【Usaco 2009 Gold 】JZOJ2020年9月19日提高B组T2 电视游戏问题

    [Usaco 2009 Gold ]JZOJ2020年9月19日提高B组T2 电视游戏问题 题目 Description 农夫约翰的奶牛们游戏成瘾!本来FJ是想要按照陶叫兽的做法拿她们去电击戒瘾的,可 ...

  4. 【Usaco 2009 Silver】JZOJ2020年9月19日提高B组T1 音乐节拍

    [Usaco 2009 Silver]JZOJ2020年9月19日提高B组T1 音乐节拍 题目 Description FJ准备教他的奶牛弹奏一首歌曲,歌曲由N(1<=N<=50,000) ...

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

    数位DP 同上一题Windy数 预处理求个组合数 然后同样的方法,这次是记录一下0和1的个数然后搞搞 Orz cxlove /************************************* ...

  6. 【USACO 2012 Open】Running Laps(树状数组)

    53 奶牛赛跑 约翰有 N 头奶牛,他为这些奶牛准备了一个周长为 C 的环形跑牛场.所有奶牛从起点同时起跑,奶牛在比赛中总是以匀速前进的,第 i 头牛的速度为 Vi.只要有一头奶牛跑完 L 圈之后,比 ...

  7. 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉

    DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $  当然这里的$i$和$k$都是偶数啦~ ...

  8. 【USACO 3.1】Stamps (完全背包)

    题意:给你n种价值不同的邮票,最大的不超过10000元,一次最多贴k张,求1到多少都能被表示出来?n≤50,k≤200. 题解:dp[i]表示i元最少可以用几张邮票表示,那么对于价值a的邮票,可以推出 ...

  9. 【USACO 3.1】Contact(01子串按出现次数排序)

    题意:给你一个01字符串,将长度为a到b之间(包含a.b)的子串按照出现次数排序.注意输入输出格式 题解:01子串对应一个二进制,为了区别11和011这样的不同子串,我们把长度也记录下来,官方题解是在 ...

随机推荐

  1. 当一名黑客获得一份WebShell后,会做什么

    当你获得一份webshell后,你会干嘛? 我曾获得N多webshell.什么discuz.dedecms.phpwind.phpweb.aspcms等等,甚至还包括N多自己研发的线上平台. 可是,问 ...

  2. 排序及重复元素去重的说明,TreeSet,HashSet

    先看下面一段代码: package 类集; import java.util.Set; import java.util.TreeSet; class Person{ private String n ...

  3. gitlab配置邮件通知功能操作记录

    之前已经介绍了gitlab的部署http://www.cnblogs.com/kevingrace/p/5651402.html但是没有配置邮箱通知功能,今天这里介绍下gitlab安装后的邮箱配置操作 ...

  4. 使用bootstrap-table简化CRUD

    1. 引入bootstrap-table资源包, 页首引用css, 页脚引用js 2. table 参数说明 data-toggle="table" data-toolbar=&q ...

  5. AngularJS中的身份验证

    欢迎大家指导与讨论 : )  一.  身份验证的意义  首先呢,网络应用的身份验证的意图在于:保护网站中的重要资源.基于某些原因这些资源并不能公开,比如付费资源(交过钱的用户才能上的网络课程),或者一 ...

  6. 谈谈patch strategy

    所谓的patch strategy,就是软件发布后出现bug时打补丁的方式 - 主要是关于源代码branch如何组织的方式 针对项目的开发阶段.开发状态.维护方式不同,可以有不同的patching s ...

  7. 翻译qmake文档(四) Building Common Project Types

    翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型        本章描述 ...

  8. HTTPS科普扫盲帖

    为什么需要https HTTP是明文传输的,也就意味着,介于发送端.接收端中间的任意节点都可以知道你们传输的内容是什么.这些节点可能是路由器.代理等. 举个最常见的例子,用户登陆.用户输入账号,密码, ...

  9. .net破解一(反编译,反混淆-剥壳)

    大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想 ...

  10. 用程序集编写clr表值函数:把正则表达式引入数据库中

    正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...