上周比赛的题目,由于那个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. 【CF1217F】Forced Online Queries Problem

    题意 题目链接 动态图连通性,加密方式为 \((x+l-1)\bmod n +1\) (\(l=[上一次询问的两点连通]\)). 点数 \(n\),操作数 \(m\) \(\le 2\times 10 ...

  2. Wireshark安装失败或找不到网络接口问题

    Wireshark安装失败或找不到网络接口问题 Wireshark捕获数据包,主要依赖Winpcap或Npcap组件.从Wireshark 3.0开始,Npcap代替了Winpcap组件,成为Wire ...

  3. SciPy 优化

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  4. Plcsim 模拟IO访问故障 OB122组织块

    假设在OB1 中用 如下指令 T PQW20 实际在组态的时候就没有QW20 这个地址 所以会显示访问IO 错误 我在OB122 中设置一个变量 进入一次 加1 可以看到每个扫描周期都要调用一次OB1 ...

  5. windows下 RN 环境搭建

    01.安装 Android Studio 02.NodeJs 03.Python204.JDK 05.安装Genymotion模拟器06.java 环境配置07.andriud sdk 配置08.An ...

  6. 主机ping虚拟机失败。虚拟机ping主机,可以ping通。

    原文:https://blog.csdn.net/ww1473345713/article/details/51490525 今天打开虚拟机,然后用Xshell远程连接,发现连接不上.按照以下顺序检查 ...

  7. vue的MVVM

    Vue的相关知识有 字符串模板 MVVM 虚拟dom和domdiff,查看下一篇笔记 字符串模板 function render(template, data) { const reg = /\{\{ ...

  8. ERP开发准备

    Delphi 开发 ERP [1] 准备 使用的控件FireDac.DevExpress.FastReport. FireDac:新一代的数据库控件. DevExpress:界面UI. FastRep ...

  9. Fedora Workstation 31众多功能得到改进

    导读 周一,Red Hat的桌面高级经理Christian F.K. Schaller分享了一篇博客文章,概述了Fedora Workstation 31的各种改进和特性.这些包括Wayland的改进 ...

  10. [LeetCode] 931. Minimum Falling Path Sum 下降路径最小和

    Given a square array of integers A, we want the minimum sum of a falling path through A. A falling p ...