bzoj 4259 4259: 残缺的字符串【FFT】
和bzoj 4503 https://www.cnblogs.com/lokiii/p/10032311.html 差不多,就是再乘上一个原串字符
有点卡常,先在点值下算最后一起IDFT
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=1100005;
int n,m,bt,lm,re[N],tot;
long long x[N],y[N];
double sm;
char s[N],t[N];
struct cd
{
double a,b;
cd(double A=0,double B=0)
{
a=A,b=B;
}
cd operator + (const cd &x) const
{
return cd(a+x.a,b+x.b);
}
cd operator - (const cd &x) const
{
return cd(a-x.a,b-x.b);
}
cd operator * (const cd &x) const
{
return cd(a*x.a-b*x.b,a*x.b+b*x.a);
}
}a[N],b[N],c[N];
void dft(cd a[],int f)
{
for(int i=0;i<lm;i++)
if(i<re[i])
swap(a[i],a[re[i]]);
for(int i=1;i<lm;i<<=1)
{
cd wi=cd(cos(M_PI/i),f*sin(M_PI/i));
for(int k=0;k<lm;k+=(i<<1))
{
cd w=cd(1,0),x,y;
for(int j=0;j<i;j++)
{
x=a[j+k],y=w*a[i+j+k];
a[j+k]=x+y,a[i+j+k]=x-y;
w=w*wi;
}
}
}
if(f==-1)
for(int i=0;i<lm;i++)
a[i].a/=lm;
}
int main()
{
scanf("%d%d%s%s",&n,&m,t,s);
for(int i=0,j=n-1;i<j;i++,j--)
swap(t[i],t[j]);
for(int i=0;i<n;i++)
x[i]=(t[i]=='*')?0:t[i]-'a'+1,a[i].a=x[i]*x[i]*x[i];
for(int i=0;i<m;i++)
y[i]=(s[i]=='*')?0:s[i]-'a'+1,b[i].a=y[i];
for(bt=0;(1<<bt)<=n+m;bt++);
lm=1<<bt;
for(int i=0;i<lm;i++)
re[i]=(re[i>>1]>>1)|((i&1)<<(bt-1));
dft(a,1),dft(b,1);
for(int i=0;i<lm;i++)
c[i]=c[i]+a[i]*b[i];
for(int i=0;i<lm;i++)
a[i]=cd(x[i],0),b[i]=cd(y[i]*y[i]*y[i],0);
dft(a,1),dft(b,1);
for(int i=0;i<lm;i++)
c[i]=c[i]+a[i]*b[i];
for(int i=0;i<lm;i++)
a[i]=cd(x[i]*x[i],0),b[i]=cd(y[i]*y[i],0);
dft(a,1),dft(b,1);
for(int i=0;i<lm;i++)
c[i]=c[i]-a[i]*b[i]*cd(2,0);
dft(c,-1);
for(int i=n-1;i<m;i++)
if((int)(c[i].a+0.5)==0)
tot++;
printf("%d\n",tot);
for(int i=n-1;i<m;i++)
if((int)(c[i].a+0.5)==0)
printf("%d ",i-n+2);
return 0;
}
bzoj 4259 4259: 残缺的字符串【FFT】的更多相关文章
- luoguP4173 残缺的字符串 FFT
luoguP4173 残缺的字符串 FFT 链接 luogu 思路 和昨天做的题几乎一样. 匹配等价于(其实我更喜欢fft从0开始) \(\sum\limits_{i=0}^{m-1}(S[i+j]- ...
- Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用
P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...
- P4173 残缺的字符串(FFT字符串匹配)
P4173 残缺的字符串(FFT字符串匹配) P4173 解题思路: 经典套路将模式串翻转,将*设为0,设以目标串的x位置匹配结束的匹配函数为\(P(x)=\sum^{m-1}_{i=0}[A(m-1 ...
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
- 【BZOJ4259】残缺的字符串 FFT
[BZOJ4259]残缺的字符串 Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时, ...
- 洛谷 P4173 残缺的字符串 (FFT)
题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...
- 【BZOJ】4259: 残缺的字符串 FFT
[题意]给定长度为m的匹配串B和长度为n的模板串A,求B在A中出现多少次.字符串仅由小写字母和通配符" * "组成,其中通配符可以充当任意一个字符.n<=3*10^5. [算 ...
- BZOJ 4259 残缺的字符串 ——FFT
[题目分析] 同bzoj4503. 只是精度比较卡,需要试一试才能行O(∩_∩)O 用过long double,也加过0.4.最后发现判断的时候改成0.4就可以了 [代码] #include < ...
- BZOJ4259:残缺的字符串(FFT)
Description 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同 ...
- P4173 残缺的字符串 fft
题意:给你两个字符串,问你第一个在第二个中出现过多少次,并输出位置,匹配时是模糊匹配*可和任意一个字符匹配 题解:fft加速字符串匹配; 假设上面的串是s,s长度为m,下面的串是p,p长度为n,先考虑 ...
随机推荐
- 【转载】分布式RPC框架性能大比拼
dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...
- 让你的eclipse实现写JAVA代码,HTML,CSS,JAVASCRIPT代码提示
1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 改动Auto Activation triggers for java的值为:zj ...
- 组件接口(API)设计指南[2]-类接口(class interface)
*返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 类接口(class interface) 你能够參考MGTi ...
- DesiredSize,RenderSize&& Width ,ActualWidth
做UI的时候刚入门,很多属性摸不着头脑,需要的功能和属性不能很快联系联想到,所以要慢慢积累UIElement 的DesiredSize 和 RenderSize UIElement 的DesiredS ...
- Android 代码写控件
1.设置dialog弹出anthor public static SearchDialog getSearchDialog(Context context,OnDismissListener list ...
- wxpython中鼠标样式的获取与匹配
在wxpython中定义有多种默认的鼠标样式,譬如:wx.CURSORCROSS wx.CURSORHAND等等, 此处按下不表,可以参考wxpython的samples里面自带的cursor例子 这 ...
- 全局钩子 实例(不使用DLL和使用DLL两种)
大家应该都知道,全局消息钩子要依赖于一个DLL才能够正常工作.于是呢,我也就理所当在地认为全局钩子都要依赖于一个DLL才能正常工作的,我想大部分人肯定和我一样也这么认为的. 但实际上不是这样的.有某些 ...
- ZeroMQ 初步认识
http://www.danieleteti.it/zeromq-for-delphi/ https://my.oschina.net/zeroflamy/blog/109457 http://zer ...
- mysql 发生系统错误1067
一般是由配置文件错误语法不正确引起的,如my.ini本人在mysql mysql-5.6.29-winx64 配置过程中遇到“发生系统错误1067”主要由于下面两个目录写的格式不正确引起的正确写法如下 ...
- futimens函数的使用【学习笔记】
#include "apue.h" #include <fcntl.h> int main(int argc,char *argv[]) { int i,fd; str ...