CQOI2014 通配符匹配

P3167 [CQOI2014] 通配符匹配

题目大意

常见的通配符有以下两种:

  • *:可以匹配 0 0 0个及以上的任意字符
  • ?:可以匹配一个任意字符

给定一个由通配符和小写字母组成的字符串 S S S n n n个由小写字母组成的字符串 T i T_i Ti,求每个 T i T_i Ti能否被通配字符串 S S S通配。

1 ≤ n ≤ 100 1\leq n\leq 100 1n100

字符串长度不超过 1 0 5 10^5 105,通配符个数不超过 10 10 10


题解

依题意,通配符个数不超过 10 10 10,那么我们可以以通配符为界限,将通配串分为若干段。

设通配串能分为 m m m段(也就是有 m − 1 m-1 m1个通配符), o p i op_i opi表示第 i i i段之前的通配符( 0 0 0表示没有, 1 1 1表示? 2 2 2表示*), l e n i len_i leni表示第 i i i段的长度。

对于每个 T k T_k Tk,我们考虑如何判断其能否被通配字符串通配。设 f i , j f_{i,j} fi,j表示第 i i i段的结尾能否匹配上 T k T_k Tk的第 j j j个字符。那么,转移方程为

f i , j = { f i − 1 , j − l e n i o p i = 0 f i − 1 , j − l e n i − 1 o p i = 1 ∑ t = 0 j − l e n i f i − 1 , k o p i = 2 f_{i,j}= \left\{\begin{matrix} f_{i-1,j-len_i} &op_i=0 \\ f_{i-1,j-len_i-1} &op_i=1 \\ \sum\limits_{t=0}^{j-len_i}f_{i-1,k} &op_i=2 \end{matrix}\right. fi,j= fi1,jlenifi1,jleni1t=0jlenifi1,kopi=0opi=1opi=2

用哈希来判断能否转移即可。

答案为 f m , ∣ T k ∣ f_{m,|T_k|} fm,Tk

时间复杂度为 O ( ∣ S ∣ + m ∑ ∣ T k ∣ ) O(|S|+m\sum|T_k|) O(S+mTk)

code

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
const int base=31;
const long long mod=1e9+7;
int T,s1,t1,w1=0,f[15][N+5];
long long bw[N+5],h[N+5],sf[15][N+5];
char s[N+5],t[N+5];
struct node{int bg,ed,op;long long hsh;
}w[15];
void init(){bw[0]=1;for(int i=1;i<=N;i++){bw[i]=bw[i-1]*base%mod;}
}
void solve_s(){s1=strlen(s+1);w[++w1].bg=1;w[w1].op=0;for(int i=1;i<=s1;i++){if(s[i]=='?'||s[i]=='*'){w[w1].ed=i-1;w[++w1].bg=i+1;if(s[i]=='?') w[w1].op=1;else w[w1].op=2;}}w[w1].ed=s1;for(int i=1;i<=w1;i++){w[i].hsh=0;for(int j=w[i].bg;j<=w[i].ed;j++){w[i].hsh=(w[i].hsh*base+s[j]-'a'+1)%mod;}}
}
void solve_t(){t1=strlen(t+1);for(int i=1;i<=t1;i++){h[i]=(h[i-1]*base+t[i]-'a'+1)%mod;}
}
long long gthsh(int l,int r){return (h[r]-h[l-1]*bw[r-l+1]%mod+mod)%mod;
}
void solve_dp(){for(int i=0;i<=w1;i++){for(int j=0;j<=t1;j++) sf[i][j]=f[i][j]=0;}if(gthsh(1,w[1].ed-w[1].bg+1)!=w[1].hsh) return;f[1][w[1].ed-w[1].bg+1]=1;for(int i=2;i<=w1;i++){sf[i-1][0]=f[i-1][0];for(int j=1;j<=t1;j++){sf[i-1][j]=sf[i-1][j-1]|f[i-1][j];}int len=w[i].ed-w[i].bg+1;for(int j=1;j<=t1;j++){if(w[i].op==1){if(j-len-1>=0&&gthsh(j-len+1,j)==w[i].hsh){f[i][j]=f[i-1][j-len-1];}}else{if(j-len>=0&&gthsh(j-len+1,j)==w[i].hsh){f[i][j]=sf[i-1][j-len];}}}}
}
int main()
{init();scanf("%s",s+1);solve_s();scanf("%d",&T);while(T--){scanf("%s",t+1);solve_t();solve_dp();if(f[w1][t1]) printf("YES\n");else printf("NO\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习 MySQL 中的 SQL_SMALL_RESULT 关键字

学习 MySQL 中的 SQL_SMALL_RESULT 关键字 SQL_SMALL_RESULT 是用于查询优化的关键字&#xff0c;适用于当预期查询结果集较小&#xff0c;同时需要对结果进行排序或分组的场景。在使用 GROUP BY 或 DISTINCT 对数据进行处理时&#xff0c;MySQL 通常会创建临时表来存储中间结…

企业微信/小程序请求完毕跳转太快没有提示语怎么办?

在跳转之前加个定时器就好了。 save(paymentStatus) {uni.showLoading({title: 请求中,mask: true});var data this.data;var res {propertyId: data.propertyId,paymentStatus: paymentStatus}var its {propertyId: data.propertyId,propertyNo: data.propertyNo,examineRe…

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

JavaScript 中的闭包是什么?有哪些应用场景?

文章目录 一、闭包二、闭包的应用场景三、闭包常见问题及优缺点常见问题&#xff1a;优点&#xff1a;缺点&#xff1a; 四、JavaScript五、热门文章 一、闭包 JavaScript 中的闭包是指内部函数可以访问外部函数作用域中的变量。它是由于 JavaScript 的函数作用域规则和函数可…

如何系统学习机器学习?

要系统学习机器学习&#xff0c;首先需要掌握一些基础编程技能&#xff0c;如Python。其次&#xff0c;学习基础的数学概念&#xff0c;如线性代数、概率论和统计学。然后&#xff0c;选择一些优质的在线课程和教材进行深入学习。最后&#xff0c;通过实践项目来巩固所学知识。…

html火焰文字特效

下面是代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>HTML5火焰文字特效DEMO演示</title><link rel"stylesheet" href"css/style.css" media"screen" type&quo…

[C++] mutable的使用

文章目录 mutable其他Reference mutable 当你定义一个类&#xff0c;并且在将类的实例当作参数传递过程中&#xff0c;需要用const Class* cls_ptr方式传递时&#xff0c;会存在一种情况&#xff0c;就是虽然cls_ptr为const&#xff0c;但是你还需要调用该类的方法&#xff0c…

2024.1.23 GNSS 零散知识 学习笔记

1.天线种类 2.接收机 2.四大导航系统的介绍 3.卫星高度与轨道卫星种类 4.GNSS有哪些应用 5.在空间保持静⽌或匀速直线运动(⽆加速度)的坐标系称为惯性坐标系。 6.地⼼惯性坐标系实际上并没有满⾜能成为惯性坐标系的条件&#xff1a; ⾸先&#xff0c;地球及其质⼼都在围绕太阳…

[计算机提升] 切换(域)用户

4.14 切换(域)用户 4.14.1 为什么要切换用户 在Windows系统中&#xff0c;切换用户的主要目的是为了实现多用户共享同一台计算机的便利和安全。当多个人需要使用同一台计算机时&#xff0c;每个人可以登录自己的用户账户&#xff0c;这样可以避免互相干扰和混淆数据。 以下是…

《深入解析Java虚拟机:从JVM体系结构到垃圾回收算法》

文章目录 JVM体系结构JVM的组成 类加载器Class Loader类加载器的作用双亲委派机制JVM自带三个类加载器Bootstrap ClassLoader-根加载器ExtClassLoader-扩展加载器AppClassLoader-应用类加载器 Java历史-沙箱安全机制沙箱概念沙箱的作用本地代码和远程代码沙箱安全机制模型JDK1 …

sql server 修改表前 先判断是否有这个列

IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME Users AND COLUMN_NAME userNum) BEGINALTER TABLE UsersADD userNum INT; END 在这个示例中&#xff1a; TABLE_NAME Users 表示我们正在检查Users这张表。COLUMN_NAME userNum 表示我们在查…

寒假刷题13天

PTA甲级 1082 Read Number in Chinese 字符串处理&#xff0c;恶心 #include<iostream> #include<algorithm>using namespace std;string num[10] {"ling" , "yi" , "er" , "san" , "si", "wu" ,…

C语言快速排序(非递归)图文详解

前言&#xff1a; 上一期分析了快速排序的三种写法&#xff0c;这三种写法有一个相同点&#xff0c;都是采用递归形式来实现的&#xff0c;那么有没有非递归的方法实现呢&#xff1f;答案是当然有&#xff0c;用非递归的方法实现快速排序&#xff0c;其实可以借助数据结构中的栈…

【LangChain学习之旅】—(10) 用RouterChain确定客户意图

【【LangChain学习之旅】—&#xff08;10&#xff09; 用RouterChain确定客户意图 任务设定整体框架具体步骤如下&#xff1a; 具体实现构建提示信息的模板构建目标链 Reference&#xff1a;LangChain 实战课 任务设定 首先&#xff0c;还是先看一下今天要完成一个什么样的任…

《鸟哥的Linux私房菜》第1章——总结与简答题回答

目录 一、什么是Linux&#xff0c;有什么作用&#xff1f; 二、Linux发展史 三、Linux发行版 四、简答题部分 一、什么是Linux&#xff0c;有什么作用&#xff1f; Linux包括内核和系统调用两部分&#xff0c;是位于硬件设备与应用程序中间的操作系统。 操作系统其实也是…

54-函数的3种定义,函数的4种调用:函数模式调用,方法模式调用,构造函数模式调用,apply call bind调用

一.函数的3种定义 1.函数的声明定义:具有声明提升 <script>//函数声明定义function fn(){}</script> 2.函数的表达式定义 <script>//匿名式表达式var fn = function(){}//命名式表达式var fn1 = function a(){}</script> 3.构造函数定义 var 变量…

宝塔Linux面板卸载方法

宝塔Linux面板卸载方法 1.你需要先在面板中将通过面板安装的所有软件卸载&#xff0c;如 nginx、mysql、php 等等&#xff0c;然后&#xff0c;进入 SSH 命令行&#xff0c;输入以下命令&#xff1a; /etc/init.d/bt stop && rm -f /etc/init.d/bt && rm -rf…

利用Facebook广告进行品牌宣传的优缺点有哪些

利用Facebook广告进行品牌宣传具有以下优点&#xff1a; 精准定位受众&#xff1a;Facebook广告能够根据用户的人口统计数据、兴趣爱好、行为特征等精准定位目标受众&#xff0c;帮助广告主更好地触达潜在客户&#xff0c;提高广告效果。多样化的广告格式&#xff1a;Facebook…

distinct和group by的功能、使用和底层原理

distinct和group by的功能、使用和底层原理 distinct功能和用法 DISTINCT 是一种用于去除 SELECT 语句返回结果中重复行的关键字。在使用 SELECT 语句查询数据时&#xff0c;如果结果集中包含重复的行&#xff0c;可以使用 SELECT DISTINCT 语句来去除这些重复的行。 需要注…

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…