题目链接

题意

给定一个字符串集合,有n次搜索,每次有一个整数x和一个字符串,表示可以对字符串进行x次修改,

包括增加、修改和删除一个字符,问修改后的字符串可能是字符集中多少个字符串的前缀。

思路

简单题。 主要是觉得模糊匹配挺有意思的,虽然跟Google没啥关系

首先对给出的字符串集建 Trie。对于每一次搜索操作,在 Trie 上进行两次 dfs(算上清理是3次,因为数据范围三百万不可能 memset ,代码中将计算贡献和清除一起写了)

第一次 dfs 对于搜索串进行处理,如果匹配那么直接搜索,否则减少一次剩余修改次数并继续搜索。这个过程中,为了计算贡献需要打 tag,如果是路径上经过的 Trie 节点就标记为1,如果是结尾就标记为2.

第二次 dfs 对tag数组清除,并累加第一次出现2的位置的贡献。

代码

#include <bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int n;
char str[21]; struct Trie
{
int siz,g[N][26],val[N],vis[N];
int dep,ans;
char s[21]; void init()
{
siz=1; val[0]=0; memset( g[0],0,sizeof(g[0]) );
}
void dfs( int p,int len,int x )
{
if ( x<0 ) return;
if ( vis[p]==0 ) vis[p]=1;
if( len==dep ) { vis[p]=2; return; } int ch=s[len]-'a';
if ( g[p][ch] ) dfs( g[p][ch],len+1,x );
dfs( p,len+1,x-1 );
for ( int i=0; i<26; i++ )
if ( g[p][i] ) dfs( g[p][i],len,x-1 ),dfs( g[p][i],len+1,x-1 );
}
void clear( int p,int flag )
{
if ( vis[p]==0 ) return;
if ( flag && vis[p]==2 ) ans+=val[p],flag=0;
for ( int i=0; i<26; i++ )
if ( g[p][i] ) clear( g[p][i],flag );
vis[p]=0;
}
int calc( char *str,int x )
{
ans=0; dep=strlen(str); strcpy( s,str );
dfs( 0,0,x ); clear( 0,1 );
return ans;
}
void insert( char *str )
{
int p=0,n=strlen(str);
for ( int i=0; i<n; i++ )
{
int ch=str[i]-'a';
if ( g[p][ch]==0 )
{
val[siz]=0; memset( g[siz],0,sizeof(siz) );
g[p][ch]=siz++;
}
p=g[p][ch]; val[p]++;
}
}
}tr; int main()
{
while ( scanf( "%d",&n )==1 )
{
tr.init();
for ( int i=0; i<n; i++ )
scanf( "%s",str ),tr.insert(str);
scanf( "%d",&n );
while ( n-- )
{
int x; scanf( "%s%d",str,&x );
printf( "%d\n",tr.calc(str,x) );
}
}
}

最新文章

  1. agsXMPP
  2. 编译protobuf的jar文件
  3. UTF-8编码规则(转)
  4. jQuery实用工具函数
  5. OpenGL学习笔记2——顶点数组
  6. (转载)自动化基础普及之selenium是啥?
  7. Hibernate Id Generator and Primary Key
  8. select 框option添加属性 js计算价格 保持两位小数
  9. Latex 学习
  10. AbStract 和Interface 方法是否能用Static修饰,为什么?
  11. 用C语言扩展Python的功能
  12. 平稳退化,JS和HTML标记分离,极致性能的JavaScript图片库
  13. (转)python struct简介
  14. NhibernateProfiler-写个自动破解工具(源码)
  15. 老李分享:robotium3.6与4.0 later 的区别 2
  16. 【MySQL故障处理】 Seconds_Behind_Master= NULL Error_code: 1197
  17. Oracle Test 日志
  18. c语言之单链表的创建及排序
  19. [Docker]CentOS7下Docker安装教程
  20. Effective Java 第三版—— 90.考虑序列化代理替代序列化实例

热门文章

  1. fio测试ceph的filestore
  2. zabbix自动发现的python方式数据生成
  3. flink1.10版local模式提交job流程分析
  4. 建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
  5. 2020年SpringCloud 必知的18道面试题
  6. 通过ip访问项目
  7. zookeeper和kafka的leader和follower
  8. 讲一讲Java的字符串常量池,看完你的思路就清晰了
  9. 标准库之time,random,sys,os
  10. ccpc2020长春站F题 Strange Memory