2022春每日一题:Day 37
2024-10-20 17:30:52
题目:[USACO14FEB]Auto-complete S
字典树套路题,字典树优化剪枝,加个cnt标记即可
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
const int M=1e6+5;
using namespace std;
int tot,m,n,q;
char s[1005];
namespace trietree
{
struct trie
{
int son[26],sum,tag;
}e[M];
void insert(int len,int id)
{
int p=0;
for(int i=0;i<len;i++)
{
int k=s[i]-'a';
if(!e[p].son[k])
e[p].son[k]=++tot;
e[p].sum++;
p=e[p].son[k];
}
e[p].sum++;
e[p].tag=id;
}
int dfs(int p,int pos)
{
if(e[p].tag && pos==1)
return e[p].tag;
if(e[p].tag)
pos--;
if(!pos)
return e[p].tag;
int ok=0;
for(int i=0;i<26;i++)
{
if(!e[p].son[i])
continue;
if(e[e[p].son[i]].sum>=pos)
return dfs(e[p].son[i],pos);
pos-=e[e[p].son[i]].sum;
}
return -1;
}
int query(int len)
{
int p=0;
for(int i=0;i<len;i++)
{
int k=s[i]-'a';
if(!e[p].son[k])
return -1;
p=e[p].son[k];
}
return dfs(p,m);
}
}
using namespace trietree;
int main()
{
ios::sync_with_stdio(0);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>s;
int len=strlen(s);
insert(len,i);
}
while(q--)
{
cin>>m>>s;
int len=strlen(s);
cout<<query(len)<<'\n';
}
return 0;
}
最新文章
- STL中list和vector在添加元素时push_back会调用拷贝构造函数
- 一个ICMP单元
- 【BZOJ-1984】月下“毛景树” 树链剖分
- HLS入门收集(1)
- C#综合揭秘——Entity Framework 并发处理详解
- hdoj 2120 Ice_cream&#39;s world I【求成环数】
- 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)
- QtWebkit2.2.0 HTML5.0支持情况
- AE分级渲染
- r.js实践
- Layui下拉框改变时触发事件
- 学习Git笔记(更新中)
- Delphi7安装
- .NET代码设计简单规范
- python中的一等对象--函数
- ffmpeg 在ubuntu上编译环境搭建和开发
- php 大文件上传的实现
- OpenCV (C++) 几何形状识别(面积过滤、横纵比过滤等等)
- git file mode change
- u-boot-1.1.6第1阶段分析之make smdk2410_config指令
热门文章
- 用Python实现广度优先搜索
- KingbaseES V8R3 备份恢复案例之--单实例环境sys_rman脚本备份案例
- KingbaseES V8R6 集群环境wal日志清理
- 纯CSS实现“流星赶月”,祝大家中秋节快乐
- 引擎之旅 Chapter.1 高分辨率时钟
- day03-代码实现02
- 使用 Auditbeat 模块监控 shell 命令
- CentOS7.9 yum方式安装redis最新版
- 第五章:Admin管理后台 - 1:自定制Admin
- Elasticsearch:Elasticsearch-head - 用于浏览和与 Elasticsearch 集群进行交互的 Web 前端