题目:[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;
}

最新文章

  1. STL中list和vector在添加元素时push_back会调用拷贝构造函数
  2. 一个ICMP单元
  3. 【BZOJ-1984】月下“毛景树” 树链剖分
  4. HLS入门收集(1)
  5. C#综合揭秘——Entity Framework 并发处理详解
  6. hdoj 2120 Ice_cream&#39;s world I【求成环数】
  7. 深入浅出 - Android系统移植与平台开发(十)- Android编译系统与定制Android平台系统(瘋耔修改篇二)
  8. QtWebkit2.2.0 HTML5.0支持情况
  9. AE分级渲染
  10. r.js实践
  11. Layui下拉框改变时触发事件
  12. 学习Git笔记(更新中)
  13. Delphi7安装
  14. .NET代码设计简单规范
  15. python中的一等对象--函数
  16. ffmpeg 在ubuntu上编译环境搭建和开发
  17. php 大文件上传的实现
  18. OpenCV (C++) 几何形状识别(面积过滤、横纵比过滤等等)
  19. git file mode change
  20. u-boot-1.1.6第1阶段分析之make smdk2410_config指令

热门文章

  1. 用Python实现广度优先搜索
  2. KingbaseES V8R3 备份恢复案例之--单实例环境sys_rman脚本备份案例
  3. KingbaseES V8R6 集群环境wal日志清理
  4. 纯CSS实现“流星赶月”,祝大家中秋节快乐
  5. 引擎之旅 Chapter.1 高分辨率时钟
  6. day03-代码实现02
  7. 使用 Auditbeat 模块监控 shell 命令
  8. CentOS7.9 yum方式安装redis最新版
  9. 第五章:Admin管理后台 - 1:自定制Admin
  10. Elasticsearch:Elasticsearch-head - 用于浏览和与 Elasticsearch 集群进行交互的 Web 前端