2021杭电多校第三场 1003——Forgiving Matching

从零开始:Basler相机与pylon Viewer的工业视觉入门指南 本文详细介绍了Basler相机与pylon Viewer在工业视觉系统中的入门指南,涵盖硬件连接、软件安装、核心功能解析及实战案例。通过pylon Viewer的全面控制和参数调整功能,帮助新手快速掌握工业视觉检测技术,提升生产效率。 阅读详情

题目大意

给你两个字符串,一个长度为 nnn 模式串,一个长度为 mmm 匹配串,由字符 000 到 999 和 通配符 * 组成。问你匹配串在模式串中失配长度不超过 0,1,⋯ ,m0, 1,\cdots,m0,1,⋯,m 的字符串一共有多少个。

解题思路

考虑采用 fftfftfft 来做。
预处理
对于模式串,我们开十个数组(桶),来标记 000 到 999 出现的下标,如果出现了就标为 111,否则标为 000,对于通配符 ∗*∗ ,将 000 到 999 都标为 111,因为通配符是可以和任何字符匹配的,都能造成贡献。
对于匹配串,首先将匹配串反转,然后和模式串做同样的处理,唯一不同的就是通配符的处理。模式串中的通配符不能将所有位置都标记为 111,这样的话,如果模式串和匹配串都是通配符会重复计算,所以我们首先统计匹配串中通配符的个数,将通配符的所有位置都标为 000,最后统计答案的时候加上通配符的个数即可。
对于样例
012∗4012*4012∗4
1∗31*31∗3
模式串预处理的结果为

10010
01010
00110
00010
00011
00000
00000
00000
00000
00000

用 fftfftfft 快速处理
定义模式串中的第 iii 个串为,以第 iii 个字符开头,长度为 mmm 的连续子串。(iii 从 000 开始)
用模式串中的 000 数组与匹配串中的 000 数组做 fftfftfft 可以得到 fftfftfft 之后的数组 aaa。其中 am−i−1a_{m-i-1}am−i−1​ 即为模式串的第 iii 个串与匹配串中 000 匹配的个数。
我们对 000 到 999 每个数组做一次 fftfftfft ,然后对每一次求和一下 am−i−1a_{m-i-1}am−i−1​,再加上匹配串中通配符的个数,就可得到第 iii 个模式串和匹配串最大匹配长度。

求答案
最后我们统计一个失配为 000 到失配为 mmm 的前缀和即可。

反转操作很重要
比如你想知道 a1,a2,a3a_1, a_2, a_3a1​,a2​,a3​ 和 b1,b2,b3b_1,b_2,b_3b1​,b2​,b3​有多少个是匹配的,你不反转第二个字符串,你的结果会存在 c2,c4,c6c_2, c_4, c_6c2​,c4​,c6​ 之中,因为 c2=a1×b1,c4=a2×b2,c6=a3×b3c_2 = a_1\times b_1, c_4=a_2\times b_2, c_6 = a_3\times b_3c2​=a1​×b1​,c4​=a2​×b2​,c6​=a3​×b3​,但是反转之后结果就直接存在 c4c_4c4​ 之中, 因为 c4=a1×b3+a2×b2+a3×b1c_4 = a_1\times b_3 + a_2\times b_2 + a_3\times b_1c4​=a1​×b3​+a2​×b2​+a3​×b1​,这样才是我们 fftfftfft 的意义所在。

Code

#include <bits/stdc++.h>
#define ll long long
#define qc ios::sync_with_stdio(false); cin.tie(0);cout.tie(0)
#define fi first
#define se second
#define PII pair<int, int>
#define PLL pair<ll, ll>
#define pb push_back
using namespace std;
const int MAXN = 1e6 + 7;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
char s[MAXN],t[MAXN];
int f[10][MAXN];
int g[10][MAXN];
int n, m;
const double PI = acos(-1.0);
struct Complex
{
    double x, y;
    Complex operator+(const Complex &W) const
    {
        return {x + W.x, y + W.y};
    }
    Complex operator-(const Complex &W) const
    {
        return {x - W.x, y - W.y};
    }
    Complex operator*(const Complex &W) const
    {
        return {x * W.x - y * W.y, x * W.y + y * W.x};
    }
};
Complex a[MAXN], b[MAXN];
int R[MAXN];
int tot, bit;
void inif(int n)
{
    tot = 1, bit = 0;
    while (tot <= n)
        tot <<= 1, ++bit;
    for (int i = 0; i <= tot; ++i)
        R[i] = (R[i >> 1] >> 1) | ((i & 1) << (bit - 1));
}
void FFT(Complex f[], int total, int type, int n, int m)
{
    for (int i = 0; i < total; ++i)
        if (i < R[i])
            swap(f[i], f[R[i]]);
    for (int tot = 2; tot <= total; tot <<= 1)
    {
        Complex w1 = {cos(2 * PI / tot), type * sin(2 * PI / tot)};
        for (int pos = 0; pos < total; pos += tot)
        {
            Complex w = {1, 0};
            for (int i = pos; i < pos + tot / 2; ++i, w = w * w1)
            {
                Complex x = f[i];
                Complex y = w * f[i + tot / 2];
                f[i] = x + y;
                f[i + tot / 2] = x - y;
            }
        }
    }
    if (type == -1)
    {
        for (int i = 0; i <= n + m; ++i)
            f[i].x = (int)(f[i].x / tot + 0.5);
    }
}

// 用法
int tong[MAXN];
int ans[MAXN];
int pre[MAXN];
void solve(){
    cin >> n >> m;
	cin >> (s) >> (t);
	for (int i = 0; i < n; ++i){
	    if(s[i] == '*'){
			for (int j = 0; j <= 9; ++j){
			    f[j][i] = 1;
			}
		}
		else
			f[s[i]-'0'][i] = 1;
	}
	int cnt = 0;
	reverse(t, t+m);
	for (int i = 0; i < m; ++i){
	    if(t[i] == '*')
			cnt++;
		else
			g[t[i]-'0'][i] = 1;
	}
	for(int i = 0; i <= 9; ++i){
		for (int j = 0; j < n; ++j){
		    a[j].x = f[i][j];
		}
		for (int j = 0; j < m; ++j){
		    b[j].x = g[i][j];
		}
		inif(n + m);
		FFT(a, tot, 1, n, m), FFT(b, tot, 1, n, m);
		for (int j = 0; j <= tot-1; ++j){
		    a[j] = a[j] * b[j];
		}
		FFT(a, tot, -1, n, m);
		// 开始处理
		for (int j = m-1; j <= n-1; ++j){
		    tong[j] += (int)a[j].x;
		}
		for (int j = 0; j <= tot; ++j){
		    a[j].x = a[j].y = b[j].x = b[j].y = 0;
		}
	}
	for (int i = m-1; i <= n-1; ++i){
	    ans[tong[i] + cnt]++;
	}
	pre[m+1] = 0;
	for(int i = m; i >= 0; --i){
		pre[i] = pre[i+1] + ans[i];
	}
	for(int i = m; i >= 0; i--)
		cout << pre[i] << "\n";
	for(int i = m-1; i <= n-1; i++) tong[i] = 0;
	for (int i = 0; i <= m; ++i){
	    ans[i] = 0;
	}
	for (int i = 0; i <= 9; ++i){
	    for (int j = 0; j <= n; ++j){
	        f[i][j] = g[i][j] = 0;
	    }
	}
}

signed main()
{
    #ifdef ONLINE_JUDGE
    #else
       freopen("in.txt", "r", stdin);
       freopen("out.txt", "w", stdout);
    #endif

    qc;
    int T;
    cin >> T;
    //T = 1;
    while(T--){

        solve();
    }
    return 0;
}

高德地图爬虫 高德地图爬虫 工具:Pycharm,win10,Python3.6.4 1.需求分析 这篇爬虫和上一篇百度地图爬虫要求一样,百度地图爬虫我发现有一个auth参数会一直变化,一旦变化则获取的数据是不准确的,所以我上高德地图看了一下,高德地图没有这个反爬机制。但是高德地图大概爬取120个页面就会跳一次验证码,我这里是通过换IP解决这个问题的。 2.数据准备 同样我们需要全国地级市信息,用之前... 阅读详情

相关推荐

ADRV9009的学习历程(一)

** AD9361的同胞ADRV9009 ** 终于记录一下了 距离第一次想写博客记录自己学习的点点滴滴,大概已经过去有一年有余。一直都是停留在心有余而力不足的境界。 基本每次做项目遇到问题都会来优快云寻求帮助,这里虽离庙堂较远,但高手云集。每每读来,思绪万千,次次膜拜。 趁这次又学习了一样新物件,就记录一下,望大神看见能赐教一下。 ADRV9009 最近有项目要用到ADRV9009这个芯片。就来学习一下。做过AD9361的都知道,ADI官方会给出这个芯片的参考手册、数据手册和驱动程序。当然我只是见过AD

weixin_42868560的博客 1万+

HDU - 6975 - Forgiving Matching ( FFT字符串匹配 )

题目链接:点击进入 题目 题意 给你两个字符串 S 、T ( 只包含 字符 0 - 9 以及 * ), S 长 n , T 长 m , * 是通配符( 即可以与任何字符匹配 ),问在匹配中最多允许 k( 0 - m )个不同位置的情况下,S 中最多有多少个能与 T 匹配的子串。 思路 对于 S 的所有长度为 m 的子串,维护一个 f 记录这个子串与 T 匹配的位置数,知道了 f 也就是知道了这个子串完全匹配所需要的最小的 k 。 假如没有通配符,对于每个字符 c ,

Cosmic_Tree的博客 448

平台跳跃游戏中的自动寻路,与地图导航扩展

平台游戏:主要的游戏方式是在2D平面上使用各种方式在悬浮平台上进行移动和穿过各种障碍。 现如的平台游戏中的平台特性与种类是很多的,像马里奥(FC)的单向支撑不可穿透的,或魂斗罗(FC)单向支撑可穿透的… \ 超级玛丽 魂斗罗 空洞骑士 蔚蓝 本博文 支撑 上 上 上 左、上、右 上 穿透 无 上、下 无 上(部分) 上下 所以本文主要以向上支撑并上下穿透的平台特性来进行实现 需求分析 在关卡设计后,地形的数据需要自动识别 地形中的平台可上下穿透移动,并可向上站立 平台的移动路..

MOV的博客 3062

2022杭电多校训练第三场 1009 Package Delivery

贪心题

m0_51171995的博客 392

Oracle入门——基础语法篇

ROWID是Oracle中的一个伪列,用于唯一标识数据库中的每一行。在查询中,可以使用ROWID来定位和操作特定的行,例如,删除特定的行或更新特定的行。在Oracle中,子查询是指嵌套在另一个查询内部的查询语句,它可以作为主查询的一部分,用于提供额外的过滤条件、计算或数据源。在Oracle中,连接查询是通过使用JOIN子句将两个或多个表中的数据合并在一起,以获取满足特定条件的结果集。在Oracle数据库中,ROWID和ROWNUM都是用于对行进行标识和定位的伪列,它们在查询中的使用有一些不同之处。

麦当当的博客 3089

Solidworks曲面建模学习(二)——3D草图

本文主要是演示有一些零件在solidworks中通过3D草来绘制会更加方便。

东东不熬夜的博客 9502

杭电多校第三场

杭电多校第三场 1

海边拾贝,沧海一粟 651

从零搭建私有AI工作站:Ollama+DeepSeek+Dify本地化部署全攻略

本文提供了一份详尽的本地化AI工作站搭建指南,核心在于实现数据安全与离线可用。通过整合Ollama、DeepSeek与Dify三大工具,手把手教你完成从环境配置、模型部署到可视化应用构建的全过程,重点解决了Dify连接Ollama等关键步骤,助你打造一个完全自主可控的私有AI开发环境。

weixin_28396629的博客 311

HDU Forgiving Matching

题目链接:Problem - 6975 (hdu.edu.cn) 题意:长度为n的字符串S和长度为m的字符串T匹配(m<n),*号可以充当万能符号,允许小于等于k个字符不相等。 输入格式: 样例数 K(1<=K<=100) S串长度n T串长度m(1<=m<=n<=200 000) S串 T串 输出:第i行表示K=i-1 知识点 FFT字符串匹配 参考:(5条消息) FFT总结及FFT在字符串匹配上的应用_十分残念的博客-优快云博客 和kmp.

asiip的博客 210

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

【云原生技术】sonar的官方web接口,获取质量阀结果的接口

以下是一个示例思路,说明如何调用 SonarQube 的质量阀查询接口并在前端展示“哪些条件没过”。假设前端使用 AJAX 或 fetch 从后端接口拿到 SonarQube 返回的 JSON(或直接前端请求 SonarQube API),前端再把解析结果展示给用户。测试覆盖率 (Coverage) 当前仅有 60%,未满足最低 80% 的要求,需要补充测试或优化以提升覆盖率。接口),就会返回相应的质量阀状态信息;里使用它来查询当前质量阀(质量门)的状态。,你用它即可获取该次分析的质量阀状态。

weixin_46453070的博客 1279

2024杭电多校第三场-1001

f [ 3 ] :根据情况1,f [ 3 ] + = f [ 3 - 1 ] ,根据情况2,f [ 3 ] + = 1,而对于情况 3,没法分出来,因为是奇数 , +=0;f [ 4 ] 根据情况 1 ,f [ 4 ] + = f [ 3 ] ,根据情况 2,f [ 4 ] + = 1,根据情况 3,分成2*2。f [ 2 ] :根据情况1, f [ 2 ] + = 1,根据情况 2,f [ 2 ] += 1 , 所以f [ 2 ] = 2;的树,假如有两组这样的树,就能得到总节点为 4 的一片森林。

2302_80236366的博客 2159

【高级强化学习:算法、优化与泛化】第13章 扩散模型策略优化(Diffusion Policy Optimization)

\quad$ 计算均值 $\mu_t = \frac{1}{\sqrt{\alpha_t}} \left( x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar{\alpha}_t}} \tilde{\epsilon} \right)$.$\quad$ 组合得分估计: $\tilde{\epsilon} = \epsilon_{\text{unc}} + w \cdot (\epsilon_{\text{con}} - \epsilon_{\text{unc}})$.

u012133341的博客 337

2021 MINIEYE杯 杭电多校3 1003 Forgiving Matching 字符串FFT 1009 Rise in Price 动态规划

原题链接

qq_27873307的博客 358

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(3)签到题3题

2021“MINIEYE杯”中国大学生算法设计超级联赛(3) Start Time : 2021-07-27 12:00:00 End Time : 2021-07-27 17:00:00 Contest Type : Private Contest Status : Ended Current Server Time : 2021-07-27 17:31:07 Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Bookshop 5.37%(

小哈里的博客 1353

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2024杭电多校第三场 —— 1008比特跳跃

证明:假设使用两次比特跳跃,a->b,c->d,那么权值为 k*(a|b+c|d) ,不如直接从a->d,权值为 k*(a|d),因为a|b+c|d >= min(a,b)+min(c,d)>=a+b>=a|d。反证法:若 x|y!= y,则从1跳到y一定比从x跳到y更优。且比特跳跃若从x跳到y一定满足 x|y=y,或者是从1跳到y。由题意可知从点1到点n的最短路径最多使用1次比特跳跃。枚举子集时间复杂度O(2^n) n为二进制的位数。tag:最短路径+枚举子集。

Perfect_Life_的博客 1153

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HDU 6975 Forgiving Matching(FFT加速卷积处理字符串匹配)

题目:Problem - 6975 (dingbacode.com) 题目意思是求在最多容忍k个字符不同的情况下,B串在A串中的匹配位置的数量。A串长度为n,B串长度为m,k取遍0到m。串中还有通配符,可以匹配任意字符。 用卷积处理出匹配的情况。 由于这题字符集较少,可以直接枚举每种字符,考虑单个字符下两串的匹配情况,最后再处理所有字符的结果对答案的贡献。 考虑到这题要容忍k个不同的字符,所以要知道每个位置下的已匹配字符的个数。假设当前...

qq_53333451的博客 303

Forgiving Matching

一、 题目:原题链接 二、题解 : 三、 题解解释: 3.1 FFT:解释的很好 3.2 字符串FFT匹配:看看看 四、代码:

m0_50463885的博客 251

2021杭电多校第三场 赛后总结

2021杭电多校第三场 赛后总结 依旧菜的一 本场过了3题,没进前200。 第一题1011,求线段树节点数量,记忆化搜索0:35一发水过。 第二题1007,队友写的我没碰,1:16 三发A掉。 第三题1004,重点是处理直线斜率,1:31一发A掉。 然后又双叒叕是无限罚坐,剩下的题最后加起来读了6道,都没啥思路。1003和1009是剩下的唯二AC过百的题,愣是半点思路没有。看clarification注意到1009的数据是随机生成,于是写了个巨暴力的假算法,疯狂提交调参,参数小了就WA,大了就TLE,真就手

xiachi00的博客 325

hdu-6975 Forgiving Matching(卷积处理模糊串匹配)

题目链接:点击这里 题目大意: 给出一个长度为 nnn 的字符串 SSS 和一个长度为 mmm 的字符串 TTT 。我们定义 kkk 匹配为两个长度相同的字符串至多有 kkk 个位置不同,求当 k∈[0,m]k \in[0,m]k∈[0,m] 时,TTT 可以和 SSS 中的多少个子串匹配 题目分析: 类似于 P4173 残缺的字符串 的思路。 我们发现字符集很小,所以考虑枚举字符集的元素。 如果 Si=TjS_i=T_jSi​=Tj​ ,那么当前字符在 SSS 中以 i+m−ji+m-ji+m−j 结尾的

羊驼的博客 454

2019杭电多校第三场

1006 Fansblog 威尔逊定理 + 质数密度 题目给定一个大质数P,小于P的最大质数为Q,求Q!mod&ThinSpace;&ThinSpace;PQ!\mod PQ!modP p的范围为1e9到1e14,暴力求阶乘取模走不通,发现Q与P都为质数,根据素数密度分布,Q与P差的不是太远…直接暴力找。 (p−1)!≡−1mod&ThinSpace;&ThinSp...

侯山窝矿工 266

【hdu 6975】Forgiving Matching (FFT/NTT)

题目链接 题目大意 给定长度为 nnn 的字符串 sss 和长度为 mmm 的字符串 ttt ,字符串包含字符 ‘0’ ~ ‘9’ 以及通配符 ‘*’ ,统计 ttt 在 n−m+1n-m+1n−m+1 个位置上与 sss 匹配时失配的字符数。 思路 对每个字符,考虑它在 sss 和 ttt 中的生成函数,进行卷积。 如 s=“12311”, t=“5115” ,则两者字符 ‘1’ 的生成函数分别为 1+x3+x41+{x^3}+{x^4}1+x3+x4 , x−1+x−2x^{-1}+x^{-2}x−1+

qq_47903865的博客 481

2020杭电多校第三场 Tokitsukaze and Multiple

第四题:Tokitsukaze and Rescue 题目: Tokitsukaze has a sequence of length n, denoted by a. Tokitsukaze can merge two consecutive elements of a as many times as she wants. After each operation, a new element that equals to the sum of the two old elements will rep

星汐的博客 1434

HDU 6975 Forgiving Matching 快速傅里叶变换处理带通配符字符串匹配

文章目录题意题解 众所周知多校签到题中必有一道板子题,那么只要会使用板子就可以多做出一道签到了. 本题就是一道FFT的板子题. 题意 给出长度为nnn的字符串sss,长度为mmm的字符串ttt,定义两字符串匹配是两个字符串对应不相等的位置数量不超过kkk,其中通配符∗*∗能匹配任何一个字符.对k∈[0,m]k\in[0,m]k∈[0,m]的每一个值输出ttt在sss中能匹配的位置的数量. 题解 我们需要将ttt在每一个位置不能匹配上的个数加入cntcntcnt数组然后对其求一遍前缀和便能够得到答案. 对ch

Fuko_Ibuki的博客 7511

杭电2019多校第三场 HDU-6604 Blow up the city(支配树+必经点个数)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6604 题意:T组样例。第一行给出n、m(n个点,m条单向边)。接下来m行描述这条边(给出u、v)u->v。再给一个q,表明q个询问,每个询问给出a、b。询问有多少点,那它去掉后,a、b中至少一个点不能到达出度为0的点。(也就是a或b到达所有出度为0的点的必经点的个数,在反向图中也就是所有入度为0的...

birdmanqin的博客 311

2022杭电多校第三场题解

2022“杭电杯”中国大学生算法设计超级联赛(3)

weixin_46155777的博客 340
上一篇: 2021杭电多校第二场 1011——I love max and multiply
下一篇: Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma(线段树)
Linda_yezi_coder
博客等级 码龄7年 20粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值