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=1m−1​(Si​−Ti​)2∗Si​∗Ti​
当T中以i结尾的串与S能匹配的条件为:
dis(S,T[i−m+1,i])=0dis(S,T[i-m+1,i])=0dis(S,T[i−m+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=0m−1​(Sj​−Ti−j​)2∗Sj​∗Ti−j​=∑j=0m−1​Sj3​∗Ti−j​−2∗∑j=0m−1​Sj2​Ti−j2​+∑j=0m−1​Sj​∗Ti−j3​
我的板子
人傻了

这里贴的是别人的板子,开氧过了,不开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;
}

P4173 残缺的字符串相关推荐

  1. 洛谷 - P4173 残缺的字符串(多项式匹配字符串-NTT)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的字符串 sss 和一个长度为 mmm 的字符串 ttt,都含有通配符 '*',现在问字符串 ttt 可以匹配字符串 nnn 的哪些位置 题目分析 ...

  2. P4173 残缺的字符串 FFT匹配含有通配符的字符串

    传送门 文章目录 题意: 思路: 题意: 给你两个长度为m,nm,nm,n的串a,ba,ba,b,问你bbb串中每个长度为mmm的连续字串能否与aaa完全匹配,其中含有通配符∗*∗,输出每个位置的开头 ...

  3. 【BZOJ4259】残缺的字符串

    题面 1684 -- [BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现 ...

  4. BZOJ 4259: 残缺的字符串 [FFT]

    4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...

  5. 洛谷P4173:残缺的字符串(FFT、通配符匹配)

    解析 通配符匹配的经典题. 设单词串为 AAA,文章串为 BBB. 把 AAA 翻转一下,判断问题就能转化为一个卷积的形式: F(p)=&i=0m−1match(Ai+1,Bp−i)F(p)= ...

  6. 【BZOJ】4259: 残缺的字符串 FFT

    [题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...

  7. [BZOJ4259]残缺的字符串

    Description: 给定两个带通配符的串,求可能出现几次匹配,以及这些匹配位置 Hint: \(n \le 3*10^5\) Solution: 定义匹配函数 \(P(x)=\sum_{i=x} ...

  8. LGP4173残缺的字符串

    题解 由于有通配符,所以$kmp$失效了: 将通配符看成0,其余字符看成互不相同的数字,$A,B$串对应得到$a,b$数组; 定义: $f(p) = \sum_{i=0}^{m-1} a_{i}b_{ ...

  9. ●Codevs 4158 残缺的字符串

    题链: http://codevs.cn/problem/4158/ 题解: FFT. 定义两个相同长度的字符串s1,s2的距离为 $$dis(s1,s2)=\sum_{i=0}^{len-1}(s1 ...

最新文章

  1. GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
  2. 【行业应用】一文讲通电力数字化转型
  3. button hover逐渐变色_两当水库界桩@产品长久不变色 - 两当安全防护
  4. Leetcode-整数反转 C++
  5. 轮播图高度自适应_干货!弘成教你写轮播图全自动适应封装代码
  6. TCP报文( tcp dup ack 、TCP Retransmission)
  7. R语言基本用法(主要为时间序列分析方面)
  8. YTU OJ 2476 Problem B C++习题 继承与组合
  9. 不止跑路,拯救误操作rm -rf /*的小伙儿
  10. 微信小程序-全局分享、自定义分享
  11. Flutter版本 网易云音乐
  12. 抓包分析,一条Linux命令实现路由器自动登录深大校园网认证(Drcom Pt版)
  13. 8人Python-----day02
  14. 【第三方API】顺丰电子面单SDK调用总结-java
  15. (转)编程的三层境界——器、术、道
  16. Yet Another Text Captcha Solver: A Generative Adversarial Network Based Approach
  17. 地下水运动方程的解析解(一维潜水)
  18. Layui 表格 list页显示图片
  19. 一个netdisk storage backend app webos和增强的全功能网站云设想
  20. Android java synchronized原理

热门文章

  1. 中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!
  2. 免费使用的支付宝,到底是怎么一年赚1206亿的?
  3. 深度学习框架PyTorch与TensorFlow,谁更胜一筹?
  4. 这9个人气超高的公众号,你还没关注吗?
  5. 每日一笑 | 爱的魔力转圈圈~
  6. 全球100款大数据工具汇总(前50款)
  7. 鉴别一个人是否 js 入门的标准竟然是?!
  8. Spark运行原理剖析
  9. promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...
  10. java web请求字符串处理_java web工作常用技能篇(三)-封装复杂请求对象2