上周比赛的题目,由于那个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[][];
char wlist[][];
int vis[];
int w,n,inq[][];
char rec[];
int dir[][]={{,},{,},{,-},{-,},{,},{,-},{-,-},{-,}};
int cnt,ch[][],val[],ids[];
int point[]={,,,,,,,,,,};
int ans_num,ans_point;
char anschar[];
void inserts(char* s,int num)
{
int rt=;
int len=strlen(s);
for (int i=;i<len;i++){
int k=s[i]-'A';
if (ch[rt][k]==-){
ch[rt][k]=cnt++;
}
rt=ch[rt][k];
}
val[rt]=point[len];
ids[rt]=num;
}
void solve(char* s)
{
int rt=;
int len=strlen(s);
for (int i=;i<len;i++){
int k=s[i]-'A';
if (ch[rt][k]==-) break;
rt=ch[rt][k];
}
if (val[rt]!=- && vis[ids[rt]]==){
vis[ids[rt]]=;
ans_num++;
ans_point+=val[rt];
if (ans_num==)
memcpy(anschar,s,);
else if (len==strlen(anschar) && strcmp(s,anschar)<)
memcpy(anschar,s,);
else if (len>strlen(anschar))
memcpy(anschar,s,);
}
}
void dfs(int x,int y,int d)
{
if (d>) return;
rec[d-]=mat[x][y];
rec[d]='\0';
solve(rec);
inq[x][y]=;
int tmp;
for (int i=;i<;i++){
int nx=x+dir[i][];
int ny=y+dir[i][];
if (nx< || ny< || nx>= || ny>=) continue;
if (inq[nx][ny]) continue;
inq[nx][ny]=;
dfs(nx,ny,d+);
inq[nx][ny]=;
}
inq[x][y]=;
}
int main()
{
//freopen("rand.in","r",stdin);
//freopen("rand.out","w",stdout);
while (scanf("%d",&w)!=EOF)
{ memset(ch,-,sizeof ch);
memset(val,-,sizeof val);
memset(ids,-,sizeof ids);
cnt=;
for (int i=;i<w;i++){
scanf("%s",wlist[i]);
inserts(wlist[i],i);
}
scanf("%d",&n);
for (int i=;i<n;i++){
memset(vis,,sizeof vis);
ans_num=ans_point=;
for (int j=;j<;j++) {scanf("%s",mat[j]);}
for (int q=;q<;q++)
for (int k=;k<;k++){
dfs(q,k,);
}
printf("%d %s %d\n",ans_point,anschar,ans_num);
} }
return ;
}

GCPC 2013_A Boggle DFS+字典树 CSU 1457的更多相关文章

  1. POJ 3764 - The xor-longest Path - [DFS+字典树变形]

    题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...

  2. hdu 1979 DFS + 字典树剪枝

    http://acm.hdu.edu.cn/showproblem.php?pid=1979 Fill the blanks Time Limit: 3000/1000 MS (Java/Others ...

  3. POJ 1816 - Wild Words - [字典树+DFS]

    题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...

  4. HDU 1298 T9(字典树+dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1298 题意:模拟手机9键,给出每个单词的使用频率.现在给出按键的顺序,问每次按键后首字是什么(也就是要概率最大的 ...

  5. HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序

    题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...

  6. HDU1298 字典树+dfs

    T9 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  7. ACM学习历程—CSU 1216 异或最大值(xor && 贪心 && 字典树)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1216 题目大意是给了n个数,然后取出两个数,使得xor值最大. 首先暴力枚举是C(n,  ...

  8. AcWing:144. 最长异或值路径(dfs + 01字典树)

    给定一个树,树上的边都具有权值. 树中一条路径的异或长度被定义为路径上所有边的权值的异或和: ⊕ 为异或符号. 给定上述的具有n个节点的树,你能找到异或长度最大的路径吗? 输入格式 第一行包含整数n, ...

  9. Codeforces 979 字符串强制N变换最多出现字母 DFS子树 暴力01字典树

    A /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) ...

随机推荐

  1. 定时执行 Job【转】

    Linux 中有 cron 程序定时执行任务,Kubernetes 的 CronJob 提供了类似的功能,可以定时执行 Job.CronJob 配置文件示例如下: ① batch/v2alpha1 是 ...

  2. GNS3 模拟icmp路由跟踪

    R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 no ip routing end R2 f0/0: conf t ...

  3. 201706 gem 'rails-erd'生成Model关系图

    [工具]一张图理清各个model之间关系 安装 Graphviz 2.22+: 终端机中执行 brew install graphviz Gemfile中添加 gem 'rails-erd' 终端机中 ...

  4. springCloud 之 Eureka注册中心高可用配置

    springCloud的eureka高可用配置方案思路是:几个服务中心之间相互注册,比如两个注册中心,A注册到B上,B注册到A上,如果是三个注册中心则是:A注册到BC上,B注册到AC上,C注册到AB上 ...

  5. Oracle删除重复数据并且只留其中一条数据

    数据库操作中,经常会因为导数据造成数据重复,需要进行数据清理,去掉冗余的数据,只保留正确的数据 一:重复数据根据单个字段进行判断 1.首先,查询表中多余的数据,由关键字段(name)来查询. sele ...

  6. JavaScript基于原型的继承

    在一个纯粹的原型模式中,我们会摒弃类,转而专注于对象,基于原型的继承相比基于类的继承的概念上更为简单 if( typeof Object.beget !== 'function') { Object. ...

  7. MQTT 协议学习:005-发布消息 与 对应报文 (PUBLISH、PUBACK、PUBREC、PUBREL)

    背景 当有订阅者订阅了有关的主题以后,通过发布消息的消息的动作,可以让订阅者收到对应主题的消息. 根据不同的QoS 等级,通信的动作也略有不同. PUBLISH – 发布消息 报文 PUBLISH控制 ...

  8. maven在windows下的安装配置及手动引入oracle数据库jar包

    一.maven的安装配置 注意:在进行如下配置之前,有个前提是你的java的jdk安装配置正确才行 1.首先,下载maven,网址http://maven.apache.org/download.cg ...

  9. redis : Can't save in background: fork: Cannot allocate memory

    redis : Can't save in background: fork: Cannot allocate memory JAVA程序报错信息: MISCONF Redis is configur ...

  10. 留学Essay写作中常见的两类要求词盘点

    写essay的时候,我们会常常因为各式各样的要求词而头疼:discuss,describing,evaluate,explain,等等,他们之间有何区别?如果你在思考这个问题,那么这篇文章就是为你写的 ...