2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-D.html
题目传送门 - 2018牛客多校赛第三场 D
题意
给定两个字符串,在根据给定的字符表转成相应的字符之后,问前一个串在后面一个串中匹配了多少次。
一个串在另一个串的某一个位置匹配,当且仅当从该位置起截取长度与那个串相同的一个子串,这个子串与那个串等价。
定义两个串等价,当且仅当这两个串的对应位置的 Ascll 码值相差不大于 1 。
任意一个串的长度 $\leq 250000$。
题解
FFT 基础套路题。
为了偷懒,我们写 11 次 DFT 。
但是这样做 double 精度不大行,long double 要超时。
所以我们用 NTT 来搞定。
注意别爆 long long 。
关于 FFT 和套路介绍,下面这个链接所指向的博文有详细介绍。
https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html
套路:
首先将第一个串翻转一下。
然后构造式子:
$f_i=\sum_{j=0}^{i} (S_i-T_j)^2((S_i-T_j)^2-1)$
展开之后 NTT 算出来就可以了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1<<22,mod=998244353;
int a,b,n,d;
int S[N],T[N],R[N];
char S1[N],T1[N];
char s[27];
int Pow(int x,int y){
int ans=1;
for (;y;y>>=1,x=1LL*x*x%mod)
if (y&1)
ans=1LL*ans*x%mod;
return ans;
}
int w[N],A[N];
int A4[N],A3[N],A2[N],A1[N],A0[N];
int B4[N],B3[N],B2[N],B1[N],B0[N];
void FFT(int a[],int n){
for (int i=0;i<n;i++)
if (i<R[i])
swap(a[i],a[R[i]]);
for (int t=n>>1,d=1;d<n;d<<=1,t>>=1)
for (int i=0;i<n;i+=(d<<1))
for (int j=0;j<d;j++){
int tmp=1LL*w[t*j]*a[i+j+d]%mod;
a[i+j+d]=(a[i+j]-tmp)%mod;
a[i+j]=(a[i+j]+tmp)%mod;
}
}
vector <int> vec;
int main(){
scanf("%s%s%s",S1,T1,s);
a=strlen(S1),b=strlen(T1);
for (int i=0;i<a;i++)
S1[i]=s[S1[i]-'a'];
for (int i=0;i<b;i++)
T1[i]=s[T1[i]-'a'];
for (int i=0;i<a;i++)
S[a-i-1]=S1[i]-'a'+1;
for (int i=0;i<b;i++)
T[i]=T1[i]-'a'+1;
for (n=1,d=0;n<a+b;n<<=1,d++);
for (int i=0;i<n;i++)
R[i]=(R[i>>1]>>1)|((i&1)<<(d-1));
w[0]=1,w[1]=Pow(3,(mod-1)/n);
for (int i=2;i<n;i++)
w[i]=1LL*w[i-1]*w[1]%mod;
for (int i=0;i<n;i++){
A0[i]=i<a?1:0;
A1[i]=S[i];
A2[i]=S[i]*S[i];
A3[i]=S[i]*S[i]*S[i];
A4[i]=S[i]*S[i]*S[i]*S[i];
B0[i]=i<b?1:0;
B1[i]=T[i];
B2[i]=T[i]*T[i];
B3[i]=T[i]*T[i]*T[i];
B4[i]=T[i]*T[i]*T[i]*T[i];
}
FFT(A0,n),FFT(A1,n),FFT(A2,n),FFT(A3,n),FFT(A4,n);
FFT(B0,n),FFT(B1,n),FFT(B2,n),FFT(B3,n),FFT(B4,n);
for (int i=0;i<n;i++)
A[i]=(1LL*A4[i]*B0[i]%mod
-4LL*A3[i]*B1[i]%mod
+6LL*A2[i]*B2[i]%mod
-4LL*A1[i]*B3[i]%mod
+1LL*B4[i]*A0[i]%mod
-1LL*A2[i]*B0[i]%mod
+2LL*A1[i]*B1[i]%mod
-1LL*B2[i]*A0[i]%mod)%mod;
w[1]=Pow(w[1],mod-2);
for (int i=2;i<n;i++)
w[i]=1LL*w[i-1]*w[1]%mod;
FFT(A,n);
for (int i=0,inv=Pow(n,mod-2);i<n;i++)
A[i]=1LL*A[i]*inv%mod;
vec.clear();
for (int i=0;i<b-a+1;i++)
if (A[i+a-1]==0)
vec.push_back(i+1);
printf("%d\n",(int)(vec.size()));
for (int i=0;i<vec.size();i++)
printf("%d ",vec[i]);
return 0;
}
2018牛客网暑假ACM多校训练赛(第三场)D Encrypted String Matching 多项式 FFT的更多相关文章
- 2018牛客网暑假ACM多校训练赛(第二场)E tree 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round2-E.html 题目传送门 - 2018牛客多校赛第二场 E ...
- 2018牛客网暑假ACM多校训练赛(第三场)I Expected Size of Random Convex Hull 计算几何,凸包,其他
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-I.html 题目传送门 - 2018牛客多校赛第三场 I ...
- 2018牛客网暑假ACM多校训练赛(第三场)G Coloring Tree 计数,bfs
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round3-G.html 题目传送门 - 2018牛客多校赛第三场 G ...
- 2018牛客网暑假ACM多校训练赛(第十场)H Rikka with Ants 类欧几里德算法
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-H.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)F Rikka with Line Graph 最短路 Floyd
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-F.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第十场)D Rikka with Prefix Sum 组合数学
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round10-D.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
- 2018牛客网暑假ACM多校训练赛(第七场)I Tree Subset Diameter 动态规划 长链剖分 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round7-I.html 题目传送门 - https://www.n ...
- 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round6-I.html 题目传送门 - https://www.no ...
随机推荐
- Scientific Toolworks Understand
Scientific Toolworks Understand是一款定位于代码阅读的软件.界面用Qt开发的. 软件特性: 1.支持多语言:Ada, C, C++, C#, Java, FORTRAN, ...
- iOS Code Sign On Copy
上面的图中,code sign on copy 是什么意思呢? 先看专业的解释:http://stackoverflow.com/questions/30963294/creating-ios-osx ...
- lua 复制table
cocos2d-lua提供了复制方法clone(),源码如下: function clone(object) local lookup_table = {} local function _copy( ...
- java如何将一个List传入Oracle存储过程
注:本文来源于 深圳gg < java如何将一个List传入Oracle存储过程 > 一:数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tabl ...
- GitHub搭配使用Travis CI 进行自动构建服务
Travis CI (Continuous Integration)持续集成服务 用处:自动监控软件仓库,可以在代码提交后立刻执行自动测试或构建 1.在Github自己的仓库根目录里添加.travis ...
- css样式之属性操作
一.文本属性 1.text-align:cnter 文本居中 2.line heigth 垂直居中 :行高,和高度对应 3.设置图片与文本的距离:vertical-align 4.text-decor ...
- Django Admin的相关知识
一.面向对象复习 1.类的继承 class Base(object): def __init__(self,val): self.val = val def func(self): self.test ...
- string标准C++中的的用法总结(转)
转自:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻 ...
- Unity3D用户手册
Unity Manual 用户手册 Welcome to Unity. 欢迎使用Unity. Unity is made to empower users to create the best int ...
- cf1131f 构造+并查集
#include<bits/stdc++.h> using namespace std; #define maxn 150005 int f[maxn],n; vector<int& ...