GCPC 2013_A Boggle DFS+字典树 CSU 1457
上周比赛的题目,由于那个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相关推荐
- CSU 1457 Boggle (字典树+DFS)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1457 读了一遍题想到了字典树,但不知道怎么写,队友一个单词一个单词的枚举,然后暴搜过 ...
- hust1350Trie【字典树+dfs || 字典树 + LCA】
大意:告诉你一些字符串 让你组成字典树, 然后定义每个节点到所有叶子节点的距离的和等于改点的value 当根节点只有一个孩子,该根节点也算一个叶子节点 问所有节点的value的最小值 分析: 开始做的 ...
- hdu 1298 字典树 + DFS (模拟T9文本输入)
题意: 给你一些按键顺序,让你输出每一步中概率最大的那个单词,这里的概率计算方 法好好看看别弄错了,一开始就是因为弄错了,各种wa,比如 abc 1 ,ab 1,那么 ab 的概率就是2 ...
- 2019 ICPC 南京 F. Paper Grading(字典树dfs序上树套树)
Paper Grading 题意:给定nnn个字符串,有两种操作: 一.给定i,ji, ji,j,交换第iii个跟第jjj个字符串. 二.给定 str ,k,l,rk, l, rk,l,r,问你在区间 ...
- CSU 1115: 最短的名字(字典树)
1115: 最短的名字 题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1115 Description 在一个奇怪的村子中,很多人的名字都 ...
- 【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 字典 ...
- POJ 3764 Language: The xor-longest Path (01字典树+DFS)
传送门:POJ 3764 题目大意: 在树上找一段路径(连续)使得边权相异或的结果最大. 前置技能: 1.用链式前向星建图. 2. 01字典树的应用. 思路: 本题用 vector数组建图是会超时的, ...
- [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)
文章目录 T1:图 solution code T2:劫富济贫 solution code T3:小A的树 solution code T4:游戏 solution code T1:图 [问题描述] ...
- 字典树(Trie,前缀树)
目录 一,字典树 二,OJ实战 CSU 1115 最短的名字 HDU 1075 What Are You Talking About 力扣 1804. 实现 Trie (前缀树) II 力扣 139. ...
最新文章
- 一张图看懂微软人工智能
- Python第五、六种数据类型——Set(集合) and Dictionary(字典)
- ubuntu c/c++ 生成.so 并被python调用
- Rsyslog Queue调优
- 安卓java游戏模拟器_java游戏模拟器安卓版下载
- (数据结构)约瑟夫环问题——C语言实现
- openSUSE安装WPS
- 推荐两个适合代码的字体
- linux 单网卡 双ip,Linux操作系统单网卡双IP的设置
- 【备忘】虚拟化容器/Docker视频教程/kubernetes/云计算/实例教程
- UTAU中文版安装教程
- 毕业论文中期报告PPT模板
- C# 下拉菜单的设置 lookupedit
- Line 167. parse error, unexpected IS, expecting SEMICOLON ISE14.7
- un7.28:redis客户端常用命令。
- Github项目精选:2021年6月优秀项目推荐
- python毕设代做_怎么用python做毕设?
- 与领导争论问题的技巧[zt]
- Python可视化数据库Dash
- 进阶题73 纯粹合数
热门文章
- QString, QByteArray, 和 QVariant用法详解
- java 翻译框架_java框架外文翻译
- [转]	 看的逗得我差点没趴地上!
- 2020年高手都爱用的10种插画风格,全都在这了!
- 跑步运动蓝牙耳机哪个好?跑步无线运动蓝牙耳机推荐
- 操作系统真实的虚拟内存是什么样的(一)
- 论文阅读笔记《Locality Preserving Matching》
- VLOOKUP函数 table_array:无效引用
- 3D游戏建模师薪水大概是多少?从人生经历来看
- 计算机中的黑盘;蓝盘,绿盘;红盘;固态硬盘的区别