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

该博客介绍了HDU 6975 Forgiving Matching问题的解决思路,主要利用FFT(快速傅里叶变换)技术来优化字符串匹配过程。题目要求计算在最多k个位置不同的情况下,字符串S中有多少子串与字符串T相似。暴力解法的时间复杂度较高,通过预处理T串的匹配数,并计算字符位置差值,使用FFT可以有效提高求解效率。
摘要由CSDN通过智能技术生成

链接:Forgiving Matching

题意:

给出两个字符串 S , T。长度分别为n , m( 1 ≤ m ≤ n ≤ 200000 1\leq m \leq n\leq 200000 1mn200000),现定义两字符串的 ans[k]为 :字符串S中包含多少个子串与T相似(相似的定义为两字符串最多k个位置不同)。现要求出所有的 ans[k] ( 0 ≤ k ≤ m 0\leq k \leq m 0km)。

思路:

  1. 我们先来考虑如何暴力求解 , 如果我们固定 S 串,让T串往右匹配S的每一个子串 , 如果在匹配当前子串时有 x 个位置相同,那么就可以对答案 ans[m - x]到ans[m]都贡献 1,差分记录以下,最后求个前缀和就可以得到所有的答案。复杂度接近 o ( n ∗ m ) o(n * m) o(nm)
  2. 在暴力求法中,如果我们可以快速的知道 T 串匹配每一个子串时有多少个位置相同那么就能快速得到答案。所以我们可以预处理出 T 串移动 i 位的匹配数。也就是要求出对于T中的每一个字符,往右移动几位能在 S 中找到相同的字符或 * 。那就是对每一种字符都求出 S T 中所在位置的差值,就可以用FFT来求解了。类似于前几天牛客多校的 H Hash Function

代码:


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
const int num = 200002;
const double Pi = acos(-1.0);
int r[maxn];
int vis[maxn];
int T, n , m;
char s1[maxn],s2[maxn];
int ans[maxn] , cnt[maxn];
struct Complex{
   
    double x, y;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值