上周比赛的题目,由于那个B题被神编译器的优化功能给卡了,就没动过这个题,其实就是个字典树嘛。当然,由于要在Boggle矩阵里得到初始序列,我还一度有点虚,不知道是用BFS还是DFS,最后发现DFS要好一些,但是会不会超时呢,我就先敲了DFS部分,先在DFS里面输出所有情况,发现总共搜完只有24W+的情况,然后字典树的匹配几乎是常数时间(因为字符串最大长度只有8)。。。所以就试着做了一下,WA了几次,发现是数组开小了,好久没做字典树的题,我只开了节点个数目的数组,这肯定不对啊,最大可能是30W(字符串总数) *8(同上),当然实际也不会打得这么离谱,因为总共才26个字母,重合的几率很大,所以最多开个30W*2其实就够了。

今天敲字典树之后突然有种想法,发现以前敲这个都是对着模板敲,现在感觉对这个算法已经很理解了,所以我随便自己怎么发挥,没用结构体,没用指针,照样很好的实现了。

像AC自动机我还是不是特别熟练,但是我觉得再照模板敲肯定学得更慢,学算法,真的不要学形,而是要学神。

这个题目也有用AC自动机处理的,确实可以优化一些,失败的话,对应DFS回退,然后树上是对应失败节点,不过处理起来要复杂一些。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char mat[10][10];
char wlist[400010][10];
int vis[500010];
int w,n,inq[10][10];
char rec[10];
int dir[][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,-1},{-1,1}};
int cnt,ch[410010][27],val[500010],ids[500010];
int point[]={0,0,0,1,1,2,3,5,11,11,11};
int ans_num,ans_point;
char anschar[10];
void inserts(char* s,int num)
{int rt=0;int len=strlen(s);for (int i=0;i<len;i++){int k=s[i]-'A';if (ch[rt][k]==-1){ch[rt][k]=cnt++;}rt=ch[rt][k];}val[rt]=point[len];ids[rt]=num;
}
void solve(char* s)
{int rt=0;int len=strlen(s);for (int i=0;i<len;i++){int k=s[i]-'A';if (ch[rt][k]==-1) break;rt=ch[rt][k];}if (val[rt]!=-1 && vis[ids[rt]]==0){vis[ids[rt]]=1;ans_num++;ans_point+=val[rt];if (ans_num==1)memcpy(anschar,s,10);else if (len==strlen(anschar) && strcmp(s,anschar)<0)memcpy(anschar,s,10);else if (len>strlen(anschar))memcpy(anschar,s,10);}
}
void dfs(int x,int y,int d)
{if (d>8) return;rec[d-1]=mat[x][y];rec[d]='\0';solve(rec);inq[x][y]=1;int tmp;for (int i=0;i<8;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if (nx<0 || ny<0 || nx>=4 || ny>=4) continue;if (inq[nx][ny]) continue;inq[nx][ny]=1;dfs(nx,ny,d+1);inq[nx][ny]=0;}inq[x][y]=0;
}
int main()
{//freopen("rand.in","r",stdin);//freopen("rand.out","w",stdout);while (scanf("%d",&w)!=EOF){memset(ch,-1,sizeof ch);memset(val,-1,sizeof val);memset(ids,-1,sizeof ids);cnt=1;for (int i=0;i<w;i++){scanf("%s",wlist[i]);inserts(wlist[i],i);}scanf("%d",&n);for (int i=0;i<n;i++){memset(vis,0,sizeof vis);ans_num=ans_point=0;for (int j=0;j<4;j++) {scanf("%s",mat[j]);}for (int q=0;q<4;q++)for (int k=0;k<4;k++){dfs(q,k,1);}printf("%d %s %d\n",ans_point,anschar,ans_num);}}return 0;
}

转载于:https://www.cnblogs.com/kkrisen/p/3759921.html

GCPC 2013_A Boggle DFS+字典树 CSU 1457相关推荐

  1. CSU 1457 Boggle (字典树+DFS)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1457 读了一遍题想到了字典树,但不知道怎么写,队友一个单词一个单词的枚举,然后暴搜过 ...

  2. hust1350Trie【字典树+dfs || 字典树 + LCA】

    大意:告诉你一些字符串 让你组成字典树, 然后定义每个节点到所有叶子节点的距离的和等于改点的value 当根节点只有一个孩子,该根节点也算一个叶子节点 问所有节点的value的最小值 分析: 开始做的 ...

  3. hdu 1298 字典树 + DFS (模拟T9文本输入)

    题意:       给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...

  4. 2019 ICPC 南京 F. Paper Grading(字典树dfs序上树套树)

    Paper Grading 题意:给定nnn个字符串,有两种操作: 一.给定i,ji, ji,j,交换第iii个跟第jjj个字符串. 二.给定 str ,k,l,rk, l, rk,l,r,问你在区间 ...

  5. CSU 1115: 最短的名字(字典树)

    1115: 最短的名字 题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 Description 在一个奇怪的村子中,很多人的名字都 ...

  6. 【CODE】Unique Paths Word Search (DFS dp 字典树)

    目录 62. Unique Paths 63. Unique Paths II 980. Unique Paths III 79. Word Search 212. Word Search II 字典 ...

  7. POJ 3764 Language: The xor-longest Path (01字典树+DFS)

    传送门:POJ 3764 题目大意: 在树上找一段路径(连续)使得边权相异或的结果最大. 前置技能: 1.用链式前向星建图. 2. 01字典树的应用. 思路: 本题用 vector数组建图是会超时的, ...

  8. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

    文章目录 T1:图 solution code T2:劫富济贫 solution code T3:小A的树 solution code T4:游戏 solution code T1:图 [问题描述] ...

  9. 字典树(Trie,前缀树)

    目录 一,字典树 二,OJ实战 CSU 1115 最短的名字 HDU 1075 What Are You Talking About 力扣 1804. 实现 Trie (前缀树) II 力扣 139. ...

最新文章

  1. 一张图看懂微软人工智能
  2. Python第五、六种数据类型——Set(集合) and Dictionary(字典)
  3. ubuntu c/c++ 生成.so 并被python调用
  4. Rsyslog Queue调优
  5. 安卓java游戏模拟器_java游戏模拟器安卓版下载
  6. (数据结构)约瑟夫环问题——C语言实现
  7. openSUSE安装WPS
  8. 推荐两个适合代码的字体
  9. linux 单网卡 双ip,Linux操作系统单网卡双IP的设置
  10. 【备忘】虚拟化容器/Docker视频教程/kubernetes/云计算/实例教程
  11. UTAU中文版安装教程
  12. 毕业论文中期报告PPT模板
  13. C# 下拉菜单的设置 lookupedit
  14. Line 167. parse error, unexpected IS, expecting SEMICOLON ISE14.7
  15. un7.28:redis客户端常用命令。
  16. Github项目精选:2021年6月优秀项目推荐
  17. python毕设代做_怎么用python做毕设?
  18. 与领导争论问题的技巧[zt]
  19. Python可视化数据库Dash
  20. 进阶题73 纯粹合数

热门文章

  1. QString, QByteArray, 和 QVariant用法详解
  2. java 翻译框架_java框架外文翻译
  3. [转] 看的逗得我差点没趴地上!
  4. 2020年高手都爱用的10种插画风格,全都在这了!
  5. 跑步运动蓝牙耳机哪个好?跑步无线运动蓝牙耳机推荐
  6. 操作系统真实的虚拟内存是什么样的(一)
  7. 论文阅读笔记《Locality Preserving Matching》
  8. VLOOKUP函数 table_array:无效引用
  9. 3D游戏建模师薪水大概是多少?从人生经历来看
  10. 计算机中的黑盘;蓝盘,绿盘;红盘;固态硬盘的区别