当前位置: 首页 > news >正文

Wild Words题解

Wild Words题解

1.题目大意

先给你 \(n\) 个字符串,这些字符串包含小写字母,?和 *。

其中, ? 可以表示任意一个字符,* 可以表示任意长度的任意字符(包括0个)

然后 \(m\) 次询问,每次给你一个字符串,问你它和哪些字符串匹配

2.做法

可以在字典树上 \(dfs\)

先定义一下字典树节点要存储的信息:该节点代表的字符串在一开始 \(n\) 个字符串中的位置,开个vector<int>

首先,将字符串插入字典树,这里很简单,还是该怎么插怎么插

只是?*比较特殊,我们需要将它们赋予两个特殊的编号,就26和27吧(紧接着25)

而且到了最后一个节点时,我们需要将当前插入字符串的编号加入最后一个节点的vector里。

接下来,是最令人头疼的查询

我们发现,?*会影响字符串的匹配判断

因为它们会导致匹配“跳步

比如这两个字符串,第二个去判断匹不匹配第一个字符串

zou*wa?66
zoupiwa666

我们发现,当匹配到*时,可以无视它是否与p匹配,我们可以直接跳到w(也可以是那之后的任何一个字符)进行接下来的匹配判断,?也差不多,只不过只能往后跳一位罢了。

所以这时候我们就不能按部就班的去遍历字典树了

我们需要使用 \(dfs\) 来遍历

dfs(int u,int dep,string s)

\(u\) :当前遍历到的字典树上的节点

\(dep\) :当前匹配到了第几个字符

\(s\) :要匹配的字符串

分四种情况:

  • 边界:当dep==s.size()时,把当前 \(u\) 节点上存储的所有下标加入到存储答案的vector
  • \(u\)的下一个字符可以是* :当son[u][27]>0时,去进行跳步,也就是可以直接跳到dfs(son[u][27],i,s)注意这里 \(dep \le i \le s.size()\),因为有*时可以随意匹配
  • \(u\)的下一个字符可以是? :当son[u][26]>0时,往后跳一位,也就是跳到dfs(son[u][27],dep+1,s)
  • \(u\)的下一个字符成功与询问串匹配 :这是最基本的,直接跳到dfs(son[u][ch],dep+1,s)

注意:

刚刚的第二步要放到第一步边界之前,因为有可能查询串最后一个字符是*

要对答案排序、去重

3.Code

#include<bits/stdc++.h>
using namespace std;
int son[1000010][28],n,m,cnt=1;
vector<int>pos[1000010],ans;
inline int getnum(char ch){if(ch>='a' and ch<='z')return ch-'a';if(ch=='?')return 26;return 27;
}
inline void insert(string s,int id){int now=1;for(auto c:s){int ch=getnum(c);if(!son[now][ch])son[now][ch]=++cnt;now=son[now][ch];}pos[now].push_back(id);
}
inline void dfs(int u,int dep,string s){if(son[u][27])for(int i=dep;i<=s.size();i++)dfs(son[u][27],i,s);if(dep==s.size()){for(auto v:pos[u])ans.push_back(v);return;}int ch=getnum(s[dep]);if(son[u][ch])dfs(son[u][ch],dep+1,s);if(son[u][26])dfs(son[u][26],dep+1,s);
}
main(){cin.tie(0)->ios::sync_with_stdio(0);cin>>n>>m;for(int i=1;i<=n;i++){string t;cin>>t;insert(t,i-1);}//cout<<cnt;for(int i=1;i<=m;i++){ans.clear();string s;cin>>s;dfs(1,0,s);sort(ans.begin(),ans.end());ans.resize(unique(ans.begin(),ans.end())-ans.begin());if(ans.size()==0)cout<<"Not match";for(auto x:ans)cout<<x<<' ';cout<<'\n';}return 0;
}
http://www.jsqmd.com/news/370714/

相关文章:

  • AXI UART_LITE linux测试
  • 《信号与系统》(4)| 信号能量与功率的辨析:从公式到工程
  • 2026贝赛思入学备考特训与冲刺班推荐:提分特训机构及升学备考机构盘点 - 品牌2025
  • Krea AI:告别“贴图重复”?AI 材质炼金流,3分钟手搓 8K 水磨石
  • 公考/省考面试班怎么选?2026最新TOP6面试机构排名揭晓加深度评测! - 深度智识库
  • 2026年公考/省考/事业编面试班怎么选?行业真实测评与十大机构排名指南 - 深度智识库
  • 《信号与系统》(5)| 信号变换——时移和尺度变换的本质差别
  • 集星獭 | 项目常见的URL参数乱码问题分析与解决方案
  • 导师推荐 9个降AI率软件降AIGC网站:专科生降AI率必备工具全测评
  • 系统代码,到底要修改的文件是在v_sys下还是在u_sys目录下?
  • 复合型人才正吃香!2026大专“大数据与会计”专业适配的就业全景图
  • Qt 串口通信
  • 权威榜单揭晓:2025年优质权威的土耳其移民中介推荐TOP3排行榜 - 行业观察日记
  • 使用WinDbg调试器分析内核对象:深入ALPC端口与句柄追踪
  • synchronized
  • 从课堂到高薪岗:2026高职大数据技术专业考证避坑+推荐清单
  • 翻译助手重磅上线,您的高效翻译新选择
  • 基于微信小程序的博物馆知识科普服务闯关平台设计与实习 三端 web pc
  • 导师严选!千笔AI,好评如潮的AI论文网站
  • 坑:两次操作,使用ACE的gettimeofday(),获取时间戳,时间戳一致,写入时序库失败。
  • Claude Code从小白到大神的10000字终极指南
  • 2026深圳美国留学中介机构推荐:三大本土靠谱美国留学中介机构盘点 - 品牌2025
  • ceph t版本的ratelimit
  • 2026年深圳公司搬家服务评测推荐:告别搬迁烦恼,高效省心之选排行榜 - 品牌推荐
  • web worker和service worker
  • 使用AI辅助构建编程体系
  • “声”临其境网站分享
  • 写作压力小了!8个AI论文工具测评:MBA毕业论文与科研写作必备指南
  • 推拉窗怎么选?盘点当前市场主流品牌,慕莎尼奥门窗/门窗/断桥铝门窗/铝门窗/平移断桥提升窗,推拉窗采购排行 - 品牌推荐师
  • BUUCTF刷题MISC[十二] (105-112)