【BZOJ4503】两个串 FFT
【BZOJ4503】两个串
Description
Input
Output
Sample Input
a?aba?abba
Sample Output
HINT
题解:同【BZOJ4259】残缺的字符串
不过这里不需要外面在乘一个Si+j,所以少了一项,直接计算出来就行
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#define pi acos(-1.0)
using namespace std;
struct cp
{
double x,y;
cp (double a,double b){x=a,y=b;}
cp (){}
cp operator + (cp a){return cp(x+a.x,y+a.y);}
cp operator - (cp a){return cp(x-a.x,y-a.y);}
cp operator * (cp a){return cp(x*a.x-y*a.y,x*a.y+y*a.x);}
}n1[1<<20],n2[1<<20],n3[1<<20],n4[1<<20];
int s[1<<20],t[1<<20];
int ans[1<<20],sta[1<<20];
int l1,l2,top,n5;
char s1[1<<20],s2[1<<20];
void FFT(cp *a,int len,int f)
{
int i,j,k,h;
cp t;
for(i=k=0;i<len;i++)
{
if(i>k) swap(a[i],a[k]);
for(j=(len>>1);(k^=j)<j;j>>=1);
}
for(h=2;h<=len;h<<=1)
{
cp wn(cos(f*2*pi/h),sin(f*2*pi/h));
for(j=0;j<len;j+=h)
{
cp w(1,0);
for(k=j;k<j+h/2;k++) t=w*a[k+h/2],a[k+h/2]=a[k]-t,a[k]=a[k]+t,w=w*wn;
}
}
}
int main()
{
int i,j,len=1;
scanf("%s%s",s1,s2),l1=strlen(s1),l2=strlen(s2);
while(len<l1+2*l2) len<<=1;
for(i=0;i<l1;i++) s[i]=s1[i]-'a'+1;
for(i=0;i<l2;i++) t[l2-i-1]=(s2[i]=='?')?0:(s2[i]-'a'+1);
for(i=0;i<l1;i++) n1[i]=cp(1.0*s[i]*s[i],0.0),n3[i]=cp(2.0*s[i],0.0);
for(i=0;i<l2;i++) n2[i]=cp(1.0*t[i],0.0),n4[i]=cp(1.0*t[i]*t[i],0.0);
FFT(n1,len,1),FFT(n2,len,1),FFT(n3,len,1),FFT(n4,len,1);
for(i=0;i<len;i++) n1[i]=n1[i]*n2[i]-n3[i]*n4[i];
FFT(n1,len,-1);
for(i=0;i<l2;i++) n5+=t[i]*t[i]*t[i];
for(i=0;i<l1-l2+1;i++) if(!(int)(n1[i+l2-1].x/len+n5+0.5)) sta[++top]=i;
printf("%d\n",top);
for(i=1;i<=top;i++) printf("%d\n",sta[i]);
return 0;
}
【BZOJ4503】两个串 FFT的更多相关文章
- bzoj4503: 两个串 bitset
目录 题目链接 题解 代码 题目链接 bzoj4503: 两个串 题解 暴一发bitset f[i][j] 表示 S[1..i] 是否有个后缀能匹配 T[1..j] 那么假设 S[i+1] 能匹配 T ...
- 【bzoj4259/bzoj4503】残缺的字符串/两个串 FFT
bzoj4259 题目描述 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度为m,B串长度为n.可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有 ...
- BZOJ4259: 残缺的字符串 & BZOJ4503: 两个串
[传送门:BZOJ4259&BZOJ4503] 简要题意: 给出两个字符串,第一个串长度为m,第二个串长度为n,字符串中如果有*字符,则代表当前位置可以匹配任何字符 求出第一个字符串在第二个字 ...
- BZOJ 4503: 两个串 [FFT]
4503: 两个串 题意:兔子们在玩两个串的游戏.给定两个只含小写字母的字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有"?"字符,这个字符可以匹 ...
- BZOJ4503: 两个串
Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...
- BZOJ4503 两个串 多项式 FFT
题目传送门 - BZOJ4503 题意概括 给定两个字符串S和T,回答T在S中出现了几次,在哪些位置出现.注意T中可能有?字符,可以匹配任何字符. 题解 首先,假装你已经知道了这是一道$FFT$题. ...
- 2019.02.06 bzoj4503: 两个串(fft)
传送门 题意简述:给两个字符串s,ts,ts,t,ttt中可能有通配符,问ttt在sss出现的次数和所有位置. 思路:一道很熟悉的题,跟bzoj4259bzoj4259bzoj4259差不多的. 然后 ...
- 【bzoj4503】 两个串 FFT
$FFT$套路题(然而我看错题了) 我们考虑化一下式子. 设当前比较的两个部分为$S[i....i+|T|-1]$和$T[0....|T|-1]$. 我们对串$T$中出现问号的位置全部赋值为$0$. ...
- BZOJ4503 两个串 【fft】
题目链接 BZOJ4503 题解 水水题. 和残缺的字符串那题几乎是一样的 同样转化为多项式 同样TLE 同样要手写一下复数才A #include<algorithm> #include& ...
随机推荐
- 关于wcf,webservice,webapi或者其他服务或者接口有什么区别 WCF、WebAPI、WebService之间的区别 【转载】HTTP和SOAP完全就是两个不同的协议 WebService学习总结(一)——WebService的相关概念
wcf,webservice采用的是rpc协议,这个协议很复杂,所以每次要传递.要校验的内容也很复杂,别看我们用的很简单,但实际是frame帮我们做掉了rpc生成.解析的事情webapi遵循是rest ...
- Ant + ivy的安装
有了Ivy的帮忙,我们不需要为了一个库依赖管理而舍弃Ant去学那个难搞的Maven了. 基本配置步骤如下: 1.copy Ivy插件到ant_home/lib下: ivy安装 简单的安装方法: 直 ...
- 企业信息系统集成框架(设计思路)C++模式
设计要求: 1.企业信息系统框架.第三方产品通过接口层进行分层. 2.企业信息系统框架如何自由的继承第三方产品:通过一个抽象类.(软件设计要求:模块要求松,接口要求紧). 设计步骤: 1.报文的接受与 ...
- PHP $_SERVER 变量
$_SERVER 数组元素 $_SERVER 是一个包含诸如头信息(header).路径(path)和脚本位置(script locations)的数组.它是 PHP 中一个超级全局变量,我们可以在 ...
- idea 编程字体推荐
monaco vardana fira code mediu dejavu sans mono 上述字体 在14号字 1.1倍行距 时编程比较舒服
- c语言中数组名和指针变量的区别
编译器工作原理:在64位的计算机中,当创建一个指针变量时,计算机会为它分配8个字节的存储空间.但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它 ...
- Yii2中对数据库的查询方法如下
User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find()->w ...
- 李洪强和你一起学习前端之(8)CSS复习
今天是2017年3月24日周五 每一天都是余生当中最好的一天,珍惜当下. CSS基础复习 1 复习 1.1Css第一天 css层叠样式表 基础选择器 标签选择器 p{属性: 值;} 类选择器 .自定义 ...
- Effective C++:条款39:明智而审慎地使用private继承
(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计 ...
- linux 下启动SVN服务
先转到SVN的安装目录,比如,你安装在/home/svn 下面. 然后转到bin目录下,在这里可以看见一个叫svnserve的文件,我们需要用这个来启动SVN服务. 试一下svnserve --hel ...