P4173 残缺的字符串

P4173 残缺的字符串

题意:

有A,B两个串,每个串都有通配符,问A为模板串,对于 B 的每一个位置 i,从这个位置开始连续 m 个字符形成的子串是否可能与 A 串完全匹配?

题解:

我们定义两个字符串S,T的距离为:
dis(S,T)=∑i=1m−1(Si−Ti)2∗Si∗Ti\sum_{i=1}^{m-1}(S_{i}-T_{i})^2*S_{i}*T_{i}i=1m1(SiTi)2SiTi
当T中以i结尾的串与S能匹配的条件为:
dis(S,T[i−m+1,i])=0dis(S,T[i-m+1,i])=0dis(S,T[im+1,i])=0
fi=∑j=0m−1(Sj−Ti−j)2∗Sj∗Ti−j=∑j=0m−1Sj3∗Ti−j−2∗∑j=0m−1Sj2Ti−j2+∑j=0m−1Sj∗Ti−j3f_{i}=\sum_{j=0}^{m-1}(S_{j}-T_{i-j})^2*S_{j}*T_{i-j}=\sum_{j=0}^{m-1}S_{j}^{3}*T_{i-j}-2*\sum_{j=0}^{m-1}S_{j}^{2}T_{i-j}^{2}+\sum_{j=0}^{m-1}S_{j}*T_{i-j}^{3}fi=j=0m1(SjTij)2SjTij=j=0m1Sj3Tij2j=0m1Sj2Tij2+j=0m1SjTij3
我的板子
人傻了
在这里插入图片描述
这里贴的是别人的板子,开氧过了,不开80

代码:

// Problem: P4173 残缺的字符串
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4173
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// Data:2021-08-24 00:29:28
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{
#ifdef LOCALstartTime= clock();freopen("in.txt", "r", stdin);
#endif
}
void Time_test()
{
#ifdef LOCALendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
#define MAXN 2000005
#define reg register
#define inl inline
#define db double
#define eps 1e-6
using namespace std;
const int Mod= 998244353;
const db Pi= acos(-1.0);
struct Complex
{db x, y;friend Complex operator+(const Complex& a, const Complex& b){return ((Complex){a.x + b.x, a.y + b.y});}friend Complex operator-(const Complex& a, const Complex& b){return ((Complex){a.x - b.x, a.y - b.y});}friend Complex operator*(const Complex& a, const Complex& b){return ((Complex){a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x});}friend Complex operator*(const Complex& a, const db& val){return ((Complex){a.x * val, a.y * val});}
} f[MAXN], g[MAXN], p[MAXN];
int n, m, lim= 1, maxn, rev[MAXN], a[MAXN], b[MAXN];
char S[MAXN], T[MAXN];
bool used[MAXN];
vector<int> v;
inl void FFT(reg Complex* A, reg int opt)
{for (reg int i= 0; i < lim; i++)if (i < rev[i])swap(A[i], A[rev[i]]);for (reg int mid= 1; mid < lim; mid<<= 1) {reg Complex Wn= ((Complex){cos(Pi / (db)mid), (db)opt * sin(Pi / (db)mid)});for (reg int j= 0; j < lim; j+= (mid << 1)) {reg Complex W= ((Complex){1, 0});for (reg int k= 0; k < mid; k++, W= W * Wn) {reg Complex x= A[j + k], y= W * A[j + k + mid];A[j + k]= x + y;A[j + k + mid]= x - y;}}}
}
int main()
{scanf("%d %d", &m, &n);scanf("%s", T + 1);scanf("%s", S + 1);for (reg int i= 1; i <= m; i++)if (T[i] != '*')a[i - 1]= T[i] - 'a' + 1;for (reg int i= 1; i <= n; i++)if (S[i] != '*')b[i - 1]= S[i] - 'a' + 1;while (lim <= (n + m)) {lim<<= 1;maxn++;}for (reg int i= 0; i < lim; i++)rev[i]= ((rev[i >> 1] >> 1) | ((i & 1) << maxn - 1));reverse(a, a + m);for (reg int i= 0; i < m; i++)f[i]= ((Complex){a[i] * a[i] * a[i], 0});for (reg int i= 0; i < n; i++)g[i]= ((Complex){b[i], 0});FFT(f, 1);FFT(g, 1);for (reg int i= 0; i < lim; i++)p[i]= p[i] + f[i] * g[i];for (reg int i= 0; i < lim; i++)f[i]= g[i]= ((Complex){0, 0});for (reg int i= 0; i < m; i++)f[i]= ((Complex){a[i] * a[i], 0});for (reg int i= 0; i < n; i++)g[i]= ((Complex){b[i] * b[i], 0});FFT(f, 1);FFT(g, 1);for (reg int i= 0; i < lim; i++)p[i]= p[i] - f[i] * g[i] * 2.0;for (reg int i= 0; i < lim; i++)f[i]= g[i]= ((Complex){0, 0});for (reg int i= 0; i < m; i++)f[i]= ((Complex){a[i], 0});for (reg int i= 0; i < n; i++)g[i]= ((Complex){b[i] * b[i] * b[i], 0});FFT(f, 1);FFT(g, 1);for (reg int i= 0; i < lim; i++)p[i]= p[i] + f[i] * g[i];FFT(p, -1);for (reg int i= m - 1; i < n; i++)if (!(int)(p[i].x / (db)lim + 0.5))v.push_back(i - m + 2);reg int Ans= v.size();printf("%d\n", Ans);for (reg int i= 0; i < Ans; i++)printf("%d ", v[i]);return 0;
}

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

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

相关文章

FFT/NTT卷积神级副本

干货满满的良心博客传送至只有小怪的村庄——请开始你的逆天之路A&#xff1a;P1919B&#xff1a;P4157刷怪升级——转战玄灵大陆C&#xff1a;P6300D&#xff1a;P3763E&#xff1a;P3321F&#xff1a;P5641G&#xff1a;P4986H&#xff1a;P4721——获得知识药剂一瓶——分治…

程会玩 | 在.NET Core里操作Git

点击上方蓝字关注“汪宇杰博客”Git是很多程序员的首选源代码版本控制工具&#xff0c;我最近也从TFVC切换到了Git&#xff0c;受益匪浅。今天我就来带大家看看如何在.NET Core里操作Git。为啥要这么做首先&#xff0c;这件事情的意义&#xff0c;并不是闲的蛋疼。我们确实有很…

Knowledge Test about Match

Knowledge Test about Match 题意&#xff1a; 给你一个B数组&#xff0c;要求你去匹配A数组[0&#xff0c;N-1]&#xff0c;计算公式f(a,b)∑i0n−1∣ai−bi∣f(a,b)\sum_{i0}^{n-1}\sqrt{|a_{i}-b_{i}|}f(a,b)∑i0n−1​∣ai​−bi​∣​,使得结果尽量小。最终结果与标准结…

一个实时收集MySql变更记录的组件CanalSharp.AspNetCore

一、关于CanalSharpCanalSharp 是阿里巴巴开源项目 Canal 的 .NET 客户端。为 .NET 开发者提供一个更友好的使用 Canal 的方式。Canal 是mysql数据库binlog的增量订阅&消费组件。CanalSharp 是 Canal 的 .NET 客户端&#xff0c;它与 Canal 是采用的Socket来进行通信的&…

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine)) 题号题目知识点ASimply Strange Sort暴力BCharmed by the GameCDeep Down BelowD1Up the Strip (simplified version)D2Up the StripEBottom-Tier ReversalsFTop-Notch Insertions A 直接暴力就行&am…

[Abp vNext 源码分析] - 1. 框架启动流程分析

一、简要说明本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程&#xff0c;让大家了解整个 Abp vNext 框架是如何运作的。总的来说 &#xff0c;Abp vNext 比起 ABP 框架更加精简。因为在 vNext 版本当中&#xff0c;原来归属于 Abp 库的许多内置的基本组件 (组织…

cf1561B. Charmed by the Game

cf1561B. Charmed by the Game 题意&#xff1a; 两人轮流发球&#xff0c;有两种得分的情况&#xff0c;一个是自己发球的回合得分&#xff0c;叫做"holds"&#xff0c;另一种是在对方发球的回合得分&#xff0c;叫做"breaks"&#xff0c;现在给出比赛结…

使用 MSIX 打包 DotNetCore 3.0 客户端程序

如何你希望你的 WPF 程序能够以 Windows 的保护机制保护起来&#xff0c;不被轻易反编译的话&#xff0c;那么这篇文章应该能帮到你。介绍MSIX 是微软于去年的 Windows 开发者日峰会 上推出的全新应用打包解决方案。其目的是取代旧式的软件打包方式&#xff0c;可用于 Win32、W…

cf1561C. Deep Down Below

cf1561C. Deep Down Below 题意&#xff1a; 有个英雄&#xff0c;英雄有自己的力量值&#xff0c;有n个洞穴&#xff0c;每个洞穴有ki个怪物&#xff0c;每个怪物有自己的血量&#xff0c;当你力量值大于怪物血量&#xff0c;你就杀死他&#xff0c;否则你就失败&#xff0c…

使用 C# 和 Blazor 进行全栈开发

Blazor 是将 C# 引入浏览器的 Microsoft 试验框架&#xff0c;正好可以填补欠缺的 C# 一环。如今&#xff0c;C# 程序员可以编写桌面、服务器端 Web、云、电话、平板电脑、手表、电视和 IoT 应用程序。Blazor 填补了欠缺的一环&#xff0c;C# 开发人员现在可以直接在用户浏览器…

AWS vs K8s 是新的 Windows vs Linux

作者&#xff1a;Ian Miell是开源程序员、演讲师、作家和博客写手以前……如果你与我一样&#xff0c;年过四十&#xff0c;又在IT行业工作&#xff0c;恐怕还记得每个人使用Windows&#xff0c;一小群但越来越多的人在业余时间埋头编译Linux的年代。Windows用户见此情形会困惑…

cf1561D Up the Strip(D1D2)

cf1561D Up the Strip(D1&&D2) 题意&#xff1a; 一个长度为n的赛道&#xff0c;一开始在n的位置&#xff0c;你要前往到1&#xff0c;每次移动你有两种方式&#xff1a; 在1和x-1之间选择一个整数y&#xff0c;并从位置x移动到位置x-y在2和x之间选择一个整数z&…

Asp.Net Core中的静态文件-12

目录本文出自《从零开始学 ASP.NET CORE MVC》目录 推荐文章&#xff1a;配置 ASP.NET Core 请求(Request)处理管道Asp.Net Core 中的静态文件在这个视频中我们将讨论如何使 ASP.NET Core 应用程序&#xff0c;支持静态文件&#xff0c;如 HTML&#xff0c;图像&#xff0c;CSS…

2018 ICPC Asia Jakarta Regional Contest

2018 ICPC Asia Jakarta Regional Contest 题号题目知识点难度AEdit DistanceBRotating GearCSmart ThiefDIcy LandEArtilleries and Defensive WallsFPopping BalloonsGGo Make It CompleteHLexical Sign SequenceILie DetectorJFuture GenerationKBoomerangsLBinary String

在.net core 中PetaPoco结合EntityFrameworkCore使用codefirst方法进行开发

在.net core开发过程中&#xff0c;使用最多的就是注入方法。但是在.net core使用PetaPoco时&#xff0c;PetaPoco还不支持进行注入方式进行处理一些问题。今天对PetaPoco进行了一些扩展&#xff0c;可以很方便的将PetaPoco进行注入操作&#xff0c;使用和EF很相似&#xff0c;…

F-Pairwise Modulo

d数组是来算&#xff08;x整除y&#xff09;*y中y比x小的数 s数组是算&#xff08;x整除y&#xff09;*y中y比x大的数 &#xff08;x整除y&#xff09;*y 看x对于前面大于他的数是枚举&#xff0c;对于前面小于他的数是d树状数组储存。 d中 x整除y表示x中有多少个y 所以 …

2020 ICPC NAC

2020 ICPC NAC 题号题目知识点难度AAnother Coin Weighing PuzzleBMini BattleshipCBomasDAll KillEGrid GuardianFHopscotch 50GICPC CampHLetter WheelsIEditing ExplosionJLunchtime Name RecallKRooted SubtreesLTomb Raider

【微服务学习】Polly:熔断降级组件

何为熔断降级“熔断器如同电力过载保护器。它可以实现快速失败&#xff0c;如果它在一段时间内侦测到许多类似的错误&#xff0c;会强迫其以后的多个调用快速失败&#xff0c;不再访问远程服务器&#xff0c;从而防止应用程序不断地尝试执行可能会失败的操作&#xff0c;使得应…

A - Junk-Mail Filter HDU - 2473

只是这样合并&#xff0c;分割点的时候就不能分了。 这样合并再加上虚拟节点&#xff0c;那么每个你要求的节点就的下面就不连其他节点了&#xff0c;这样就可以进行删除操作了 #include<iostream> #include<algorithm> #include<cstdio> #include<cstr…

为什么不要使用 async void

问题在使用 Abp 框架的后台作业时&#xff0c;当后台作业抛出异常&#xff0c;会导致整个程序崩溃。在 Abp 框架的底层执行后台作业的时候&#xff0c;有 try/catch 语句块用来捕获后台任务执行时的异常&#xff0c;但是在这里没有生效。原始代码如下&#xff1a;public class …