省队集训 Day1 残缺的字符串
【题目大意】
双串带通配符匹配。
$|S|, |T| \leq 5 * 10^5$
TL: 2s
【题解】
参考bzoj 4503
可以设计如下函数 A[i] * B[i] * (A[i] - B[i])^2
如果有通配符,A[i] = 0,否则,A[i] = s[i] - 'a' + 1;B同理。
可以自行验证,这是一种很妙的设计。
然后就是卷积的事情了。大概做9次DFT。
可以用类似于MTT的技巧搞到4次,不会写。
# include <math.h>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 5e5 + , N = 2e6 + ;
const int mod = 1e9+;
const ld pi = acos(-1.0); char s[M], t[M];
int A[M], B[M], ns, nt; struct cp {
ld x, y;
cp() {}
cp(ld x, ld y) : x(x), y(y) {}
friend cp operator + (cp a, cp b) {
return cp(a.x + b.x, a.y + b.y);
}
friend cp operator - (cp a, cp b) {
return cp(a.x - b.x, a.y - b.y);
}
friend cp operator * (cp a, cp b) {
return cp(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
}
}a[N], b[N], ans[N]; namespace FFT {
int n, lst[N]; cp w[][N];
inline void set(int _n) {
n = ;
while(n < _n) n <<= ;
for (int i=; i<n; ++i) w[][i] = cp(cos(pi * / n * i), sin(pi * / n * i)), w[][i] = cp(w[][i].x, -w[][i].y);
int len = ;
while((<<len) < n) ++len;
for (int i=; i<n; ++i) {
int t = ;
for (int j=; j<len; ++j) if(i & (<<j)) t |= (<<(len-j-));
lst[i] = t;
}
}
inline void DFT(cp *a, int op) {
cp *o = w[op];
for (int i=; i<n; ++i) if(i < lst[i]) swap(a[i], a[lst[i]]);
for (int len=; len<=n; len<<=) {
int m = len>>;
for (cp *p=a; p!=a+n; p+=len) {
for (int k=; k<m; ++k) {
cp t = o[n/len*k] * p[k+m];
p[k+m] = p[k] - t;
p[k] = p[k] + t;
}
}
}
if(op) {
for (int i=; i<n; ++i) a[i].x /= (ld)n, a[i].y /= (ld)n;
}
}
} # define L FFT::n int main() {
scanf("%s%s", t, s); ns = strlen(s), nt = strlen(t);
for (int i=; i<ns; ++i) A[i] = (s[i] == '*' ? : s[i] - 'a' + );
for (int i=; i<nt; ++i) B[i] = (t[i] == '*' ? : t[i] - 'a' + );
reverse(B, B+nt);
// (A[i] - B[i])^2 * A[i] * B[i] = A[i]^3 * B[i] + A[i] * B[i]^3 - A[i]^2 * B[i]^2
FFT :: set(max(ns, nt));
for (int i=; i<ns; ++i) a[i] = cp(A[i] * A[i] * A[i], );
for (int i=ns; i<L; ++i) a[i] = cp(, );
for (int i=; i<nt; ++i) b[i] = cp(B[i], );
for (int i=nt; i<L; ++i) b[i] = cp(, );
FFT :: DFT(a, ); FFT :: DFT(b, );
for (int i=; i<L; ++i) ans[i] = ans[i] + a[i] * b[i];
for (int i=; i<ns; ++i) a[i] = cp(A[i], );
for (int i=ns; i<L; ++i) a[i] = cp(, );
for (int i=; i<nt; ++i) b[i] = cp(B[i] * B[i] * B[i], );
for (int i=nt; i<L; ++i) b[i] = cp(, );
FFT :: DFT(a, ); FFT :: DFT(b, );
for (int i=; i<L; ++i) ans[i] = ans[i] + a[i] * b[i];
for (int i=; i<ns; ++i) a[i] = cp(A[i] * A[i] * , );
for (int i=ns; i<L; ++i) a[i] = cp(, );
for (int i=; i<nt; ++i) b[i] = cp(B[i] * B[i], );
for (int i=nt; i<L; ++i) b[i] = cp(, );
FFT :: DFT(a, ); FFT :: DFT(b, );
for (int i=; i<L; ++i) ans[i] = ans[i] - a[i] * b[i];
FFT :: DFT(ans, );
for (int i=nt-; i<ns; ++i) {
if((int)(ans[i].x-0.5) == ) printf("%d ", i-nt+);
}
puts("");
return ;
}
可能是noi前最后一次复习FFT了。
省队集训 Day1 残缺的字符串的更多相关文章
- FJ省队集训DAY1 T1
题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...
- 省队集训Day1 过河
[题目大意] 小奇特别喜欢猪,于是他养了$n$只可爱的猪,但这些猪被魔法猪教会了魔法,一不看着某些猪就会自己打起来. 小奇要带着他的猪讨伐战狂,路途中遇到了一条河.小奇找到了一条船,可惜这条船一次只能 ...
- 省队集训Day1 睡觉困难综合征
传送门:https://www.luogu.org/problem/show?pid=3613 [题解] 按二进制位分开,对于每一位,用“起床困难综合征”的方法贪心做. 写棵LCT,维护正反两种权值, ...
- 省队集训Day1 总统选举
[题目大意] 一个$n$个数的序列,$m$次操作,每次选择一段区间$[l, r]$,求出$[l, r]$中出现超过一半的数. 如果没有超过一半的数,那么就把答案钦定为$s$,每次会有$k$个数进行改变 ...
- HN2018省队集训
HN2018省队集训 Day1 今天的题目来自于雅礼的高二学长\(dy0607\). 压缩包下载 密码: 27n7 流水账 震惊!穿着该校校服竟然在四大名校畅通无阻?霸主地位已定? \(7:10\)从 ...
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- [Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform
[Luogu P4143] 采集矿石 [2018HN省队集训D5T3] 望乡台platform 题意 给定一个小写字母构成的字符串, 每个字符有一个非负权值. 输出所有满足权值和等于这个子串在所有本质 ...
- JS省队集训记
不知不觉省队集训已经结束,离noi也越来越近了呢 论考前实战训练的重要性,让我随便总结一下这几天的考试 Day 1 T1 唉,感觉跟xj测试很像啊?meet in middle,不过这种题不多测是什么 ...
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
随机推荐
- VS2013运行C++报错:This function or variable may be unsafe. Consider using fopen_s instead.
在vs2013中运行时发生的关于方法调用的不安全错误. 1.更换方法,但是有些方法更改后参数不变,所以可能比较麻烦. 2.添加一条预处理器定义: 点击项目——>属性——>c/c++——&g ...
- android仿win8
在 eoe上偶然发现已经有人实现了这个功能的源码(地址:http://www.eoeandroid.com /forum.php?mod=viewthread&tid=327557),马上下载 ...
- Generating a PDF in Codeigniter using mPDF
https://arjunphp.com/generating-a-pdf-in-codeigniter-using-mpdf/
- Spring管理事务默认回滚的异常
一.默认方式 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类),Error进行回滚. 如果一个方法抛出Exception或者Checked异 ...
- LintCode-376.二叉树的路径和
二叉树的路径和 给定一个二叉树,找出所有路径中各节点相加总和等于给定 目标值 的路径. 一个有效的路径,指的是从根节点到叶节点的路径. 样例 给定一个二叉树,和 目标值 = 5: 返回: [ ...
- 【Linux】- ps 命令
Linux ps命令用于显示当前进程 (process) 的状态. 语法 ps [options] [--help] 参数: -A 列出所有的行程 -w 显示加宽可以显示较多的资讯 -a ...
- Java notify的使用
半路出家学习java, 花了几分钟简单看了.在早上那个例子上稍微改了下, notify 对象上必须使用 synchronized 我的理解是在java synchronized只是个线程同步标志,但是 ...
- 【bzoj1606】[Usaco2008 Dec]Hay For Sale 购买干草 背包dp
题目描述 约翰遭受了重大的损失:蟑螂吃掉了他所有的干草,留下一群饥饿的牛.他乘着容量为C(1≤C≤50000)个单位的马车,去顿因家买一些干草. 顿因有H(1≤H≤5000)包干草,每一包都有它的体 ...
- Docker的结构(6-13)
一.Docker的结构. Docker命令不清楚的时候可以在命令的最后加上--help Docker和虚拟机的区别? 虚拟机的实现原理是:先模拟出一套硬件,然后在这基础上跑一个操作系统,然后在这个操作 ...
- POJ2115:C Looooops——题解
http://poj.org/problem?id=2115 题目大意:for(i=A;i!=B;i+=C),i的类型的范围为0<=a<1<<k exgcd裸题目. 设a=C, ...