bzoj4259 -- FFT
来源:互联网 发布:假火车票制作软件 编辑:程序博客网 时间:2024/05/16 05:50
题解
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define N 1200010#define Pi acos(-1)struct E{ double r,i; E(double r=0,double i=0):r(r),i(i){} E operator + (E a){ return E(r+a.r,i+a.i); } E operator - (E a){ return E(r-a.r,i-a.i); } E operator * (E a){ return E(r*a.r-i*a.i,r*a.i+i*a.r); } void operator /= (double x){ r/=x;i/=x; }}A[N],B[N];int i,j,k,n,m,p,r[N],M,a[N],b[N],l,c[N];double f[N];char s[N];inline int Get(char c){ return c=='*'?0:c-'a'+1;}inline void Init(){ for(M=1;M<=n+m;M<<=1)l++; for(i=0;i<M;i++)r[i]=(r[i>>1]>>1)|((i&1)<<l-1);}inline void FFT(E* a,int n,int d){ for(int i=0;i<n;i++) if(r[i]>i)swap(a[i],a[r[i]]); for(int i=1;i<n;i<<=1){ E wn(cos(Pi/i),d*sin(Pi/i)); for(int j=0;j<n;j+=i<<1){ E w(1,0); for(int k=0;k<i;k++){ E x=a[j+k],y=w*a[j+k+i]; a[j+k]=x+y;a[j+k+i]=x-y; w=w*wn; } } } if(d==-1)for(int i=0;i<n;i++)a[i]/=n;}inline void Solve(E* a,E* b){ FFT(a,M,1);FFT(b,M,1); for(i=0;i<M;i++)a[i]=a[i]*b[i]; FFT(a,M,-1);}int main(){ scanf("%d%d%s",&m,&n,s); Init(); for(i=0;i<m;i++)a[i]=Get(s[m-i-1]); scanf("%s",s); for(i=0;i<n;i++)b[i]=Get(s[i]); for(i=0;i<m;i++)A[i]=E(a[i]*a[i]*a[i]); for(i=0;i<n;i++)B[i]=E(b[i]); Solve(A,B); for(i=m-1;i<n;i++)f[i]+=A[i].r; for(i=0;i<m;i++)A[i]=E(a[i]*a[i]); for(;i<M;i++)A[i]=E(); for(i=0;i<n;i++)B[i]=E(b[i]*b[i]); for(;i<M;i++)B[i]=E(); Solve(A,B); for(i=m-1;i<n;i++)f[i]-=A[i].r*2; for(i=0;i<m;i++)A[i]=E(a[i]); for(;i<M;i++)A[i]=E(); for(i=0;i<n;i++)B[i]=E(b[i]*b[i]*b[i]); for(;i<M;i++)B[i]=E(); Solve(A,B); for(i=m-1,l=0;i<n;i++) if(!((int)(f[i]+A[i].r+0.1)))c[++l]=i-m+2; for(printf("%d\n",l),i=1;i<l;i++)printf("%d ",c[i]); if(l)printf("%d\n",c[l]); return 0;}
阅读全文
0 0
- bzoj4259 -- FFT
- [BZOJ4259][FFT]残缺的字符串
- [BZOJ4259] 残缺的字符串 (FFT)
- [BZOJ4259]残缺的字符串(FFT)
- bzoj4259残缺的字符串FFT解题报告
- bzoj4259: 残缺的字符串
- bzoj4259: 残缺的字符串
- [BZOJ4259]残缺的字符串
- FFT
- "fft"
- FFT
- fft
- FFT
- fft
- FFT
- FFT
- FFT
- FFT
- unbuntu下右键在终端中打开
- 面朝大海,春暖花开
- Oracle 查询表字段 注释 以及表的注释
- Spark Streaming之:Flume监控目录下文件内容变化,然后Spark Streaming实时监听Flume,然后从其上拉取数据,并计算出结果
- 使用git将项目上传到github
- bzoj4259 -- FFT
- Namenode
- 根据传入的sql查询结果返回HashMap<String,String>
- Git初识(完结)
- Linux命令学习总结: hexdump命令
- springboot (5) 与数据库进行交互
- Android消息机制(2)- Message和MessageQueue
- 欢迎使用CSDN-markdown编辑器
- 常用套接字选项(SOL_SOCKET级别)