Boggle

Problem's Link:  http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457


Mean:

给定n个串,有m个询问。

每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串。

如果n个串中有对应的串和走出的字符串相同,那么需要求出:

1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少?

2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典序最小的。

3.n个串中总共出现了多少个串?

analyse:

Trie树+DFS.

一开始我是将矩阵的dfs串加入到Trie树中,然后用n个串来匹配树,各种TLE。

后来算了一下时间复杂度,很明显将n个串插入到Trie树中,再用矩阵的dfs串去匹配树,这样更优。

当然这样的话就要自己写字典序的比较函数,也很简单,其他地方没什么坑,写的时候细心一点就行。

Time complexity: O(N+M)

Source code: 

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-08-27-13.27
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long(LL);
typedef unsigned long long(ULL);
const double eps(1e-8);

int score,num;
bool v[5000010],vv[10][10];
int dx[]= {1,1,0,-1,-1,-1,0,1};
int dy[]= {0,1,1,1,0,-1,-1,-1};
int val[]={0,0,0,1,1,2,3,5,11,11,11};
char str[300010][10],Mat[4][5],ans[10],tmp[10];

struct node
{
     node *Next[26];
     int sc,num;
     bool flag;
     node()
     {
           for(int i=0; i<26; ++i) Next[i]=NULL;
           num=0,sc=-1;
     }
} *root;

void Insert(char *s,int id)
{
     node *p=root;
     int i=0,idx;
     while(s[i])
     {
           idx=s[i]-'A';
           if(p->Next[idx]==NULL)
                 p->Next[idx]=new node();
           p=p->Next[idx];
           ++i;
     }
     p->num=id;
     p->sc=val[strlen(s)];
}

void Matching(char *s)
{
     int i=0,idx;
     node *p=root;
     int len=strlen(s);
     while(s[i])
     {
           idx=s[i]-'A';
           if(p->Next[idx]==NULL) break;
           p=p->Next[idx];
           ++i;
     }
     if(v[p->num]==false && p->sc!=-1)
     {
           ++num;
           score+=p->sc;
           v[p->num]=true;
           if(num==1 || (strlen(s)>strlen(ans)) || ((strlen(s)==strlen(ans) && strcmp(s,ans)<0)) )
                 memcpy(ans,s,10);
     }
}

void dfs(int x,int y,int cnt)
{
     if(cnt>8) return;
     tmp[cnt-1]=Mat[x][y];
     tmp[cnt]='\0';
     Matching(tmp);
     vv[x][y]=true;
     for(int i=0;i<8;++i)
     {
           int xx=x+dx[i];
           int yy=y+dy[i];
           if(vv[xx][yy]!=true && (xx>=0&&xx<4&&yy>=0&&yy<4))
           {
                 vv[x][y]=1;
                 dfs(xx,yy,cnt+1);
                 vv[x][y]=0;
           }
     }
     vv[x][y]=0;
}

int main()
{
     ios_base::sync_with_stdio(false);
     cin.tie(0);
     int n,m;
     scanf("%d",&n);
     root=new node();
     for(int i=0; i<n; ++i)
     {
           scanf("%s",str[i]);
           Insert(str[i],i);
     }
     scanf("%d",&m);
     while(m--)
     {
           memset(v,0,sizeof v);
           score=num=0;
           for(int i=0; i<4; ++i)
                 scanf("%s",Mat[i]);
           for(int i=0; i<4; ++i)
                 for(int j=0; j<4; ++j)
                       dfs(i,j,1);
           printf("%d %s %d\n",score,ans,num);
     }
     return 0;
}
/*

*/

Trie树 + DFS - CSU 1457 Boggle相关推荐

  1. LeetCode 425. 单词方块(Trie树+DFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个单词集合 (没有重复),找出其中所有的 单词方块 . 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < ...

  2. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  3. LeetCode 212. 单词搜索 II(Trie树+DFS)

    1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...

  4. F. Paper Grading(Trie树+dfs序+二维数点)

    F. Paper Grading 大佬题解 一般关于前缀的问题基本都是Trie树. 首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到 ...

  5. 【BZOJ3439】Kpm的MC密码,trie树+dfs序+主席树

    Time:2016.05.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 1.have a trie,还得是倒着建的,记录每个结尾节点的id(可能会有重复,所以开一个vecto ...

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

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

  7. poj 1816 trie树+dfs(强烈推荐,含有通配符的匹配)

    这个题目花了我一晚上才调出来,其实也不难,就是在trie树上搜索给定的单词,但是麻烦的一点是考虑的情况非常多,比如模式串可能重复,或者*?连续出现,最开始都没考虑,程序敲出来直接提交一看WA,然后看d ...

  8. POJ 2418 Hardwood Species(trie 树)

    题目链接 开始想用map的,字典序不会搞,还是老老实实的用trie树把.好久没写了,忘得差不多了. 1 #include <iostream> 2 #include <cstdio& ...

  9. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

最新文章

  1. java 流 下载文件_java 流实现文件下载问题
  2. Haar Adaboost 视频车辆检测代码和样本
  3. java执行linux shell命令,并拿到返回值
  4. UDP调用connect
  5. WPF特效-拼图游戏
  6. SpringBoot应用日志通过logstash远程上传到ES
  7. 机器学习资料整理,收藏了不后悔!
  8. Java ClassLoader findClass()方法与示例
  9. 用集合return多个值_十五个常用的 Laravel 集合(Collection)
  10. bat替换文件中的字符串_JavaScript 中替换字符串的几种方法
  11. Apache 及 Nginx 配置
  12. OpenCV实现车牌识别,OCR分割,ANN神经网络
  13. 快速设置 Docker 的三种网络代理配置
  14. 小程序input框失去焦点后触发bindinput事件
  15. 工业机器人的构成和分类
  16. Vasp第一性原理计算从零单排——石墨烯能带的计算
  17. java地铁最短距离_地铁最短路径需求分析
  18. html5移动端选择城市,移动端城市选择插件(原创)
  19. vue单向数据绑定和双向数据绑定
  20. 什么是ASP .NET?

热门文章

  1. 免费的几款内网穿透工具
  2. 初中信息技术面试计算机网络,2019下半年中学信息技术教师资格面试真题完整版...
  3. 【C语言蓝桥杯每日一题】——跑步锻炼
  4. 搜索功能这样设计,大家都说我有点东西
  5. 微信小程序~云开发Demo 实现数据的添加、查询和分页实现
  6. labuladong 公众号的使用方法
  7. H5打开支付宝小程序
  8. 网上一位仁兄关于项目管理的总结
  9. 一句话理解青蛙跳台阶(C语言递归求解)每日一题
  10. 吴恩达亲述:如何高效阅读论文,开启一个新的领域!