bzoj4503 两个串
来源:互联网 发布:ubuntu安装32位运行库 编辑:程序博客网 时间:2024/06/17 15:53
令
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;#define LL long longconst int p=998244353,g=3,maxn=1000010;int inc(int x,int y){ x+=y; return x>=p?x-p:x;}int dec(int x,int y){ x-=y; return x<0?x+p:x;}int pow(int b,int k){ int r=1; for (;k;k>>=1,b=(LL)b*b%p) if (k&1) r=(LL)r*b%p; return r;}char s[maxn],t[maxn];int a[maxn],b[maxn],ans[maxn],rev[maxn],pw[maxn],n,m,l,u,inv;void fft(int *a,int fl){ int x,t1,t2; for (int i=0;i<l;i++) if (rev[i]>i) swap(a[rev[i]],a[i]); for (int i=0;i<u;i++) for (int j=0;j<l;j+=1<<(i+1)) { x=0; for (int k=j;k<j+(1<<i);k++) { t1=a[k]; t2=(LL)a[k+(1<<i)]*pw[x]%p; a[k]=inc(t1,t2); a[k+(1<<i)]=dec(t1,t2); x+=fl*(1<<(u-i-1)); if (x<0) x+=l; } } if (fl==-1) for (int i=0;i<l;i++) a[i]=(LL)a[i]*inv%p;}int main(){ //freopen("b.in","r",stdin); int res=0; scanf("%s%s",s,t); n=strlen(s); m=strlen(t); for (int i=0;i<n;i++) s[i]=s[i]-'a'+1; for (int i=0;i<m;i++) if (t[i]=='?') t[i]=0; else t[i]=t[i]-'a'+1; for (int i=0;2*i<m-1;i++) swap(t[i],t[m-i-1]); l=1,u=0; while (l<m+n-1) l<<=1,u++; inv=pow(l,p-2); pw[0]=1; pw[1]=pow(g,(p-1)/l); for (int i=2;i<l;i++) pw[i]=(LL)pw[i-1]*pw[1]%p; for (int i=0;i<l;i++) for (int j=0;j<u;j++) rev[i]|=((i>>j)&1)<<(u-j-1); for (int i=0;i<n;i++) a[i]=s[i]*s[i]; for (int i=0;i<m;i++) b[i]=t[i]; fft(a,1); fft(b,1); for (int i=0;i<l;i++) ans[i]=(LL)a[i]*b[i]%p; //fft(ans,-1); for (int i=0;i<n;i++) a[i]=p-2*s[i]; for (int i=n;i<l;i++) a[i]=0; for (int i=0;i<m;i++) b[i]=t[i]*t[i]; for (int i=m;i<l;i++) b[i]=0; fft(a,1); fft(b,1); for (int i=0;i<l;i++) ans[i]=inc(ans[i],(LL)a[i]*b[i]%p); //for (int i=0;i<l;i++) ans[i]=(LL)a[i]*b[i]%p; //fft(ans,-1); for (int i=0;i<n;i++) a[i]=1; for (int i=n;i<l;i++) a[i]=0; for (int i=0;i<m;i++) b[i]=t[i]*t[i]*t[i]; for (int i=m;i<l;i++) b[i]=0; fft(a,1); fft(b,1); for (int i=0;i<l;i++) ans[i]=inc(ans[i],(LL)a[i]*b[i]%p); fft(ans,-1); for (int i=m-1;i<n;i++) if (!ans[i]) res++; printf("%d\n",res); for (int i=m-1;i<n;i++) if (!ans[i]) printf("%d\n",i-m+1);}
阅读全文
0 0
- BZOJ4503 两个串
- [bzoj4503]两个串
- Bzoj4503 两个串 FFT
- bzoj4503 两个串
- [bzoj4503]两个串
- bzoj4503 两个串
- Bzoj4503:两个串:FFT,构造
- [BZOJ4503]两个串(FFT)
- bzoj4503两个串 快速傅里叶变换(FFT)
- [BZOJ4503]两个串(快速傅立叶变换FFT)
- [bzoj4503]&[caioj1455][FFT]串
- bzoj4503
- 两个串-----FFT妙用!
- 4503: 两个串 FFT
- 【BZOJ 4503】两个串
- BZOJ 4503 两个串
- BZOJ 4503: 两个串
- bzoj 4503 两个串
- 命名空间
- Python XML解析之DOM
- 浅析结构体
- android app记录运行日志 捕获奔溃异常 ,存储日志到文件
- c++ stream
- bzoj4503 两个串
- servlet中的几个类--ServletConfig&ServletContext(页面访问量的功能实现)
- Mac配置php.ini文件,连接mysql数据库
- C++中new和molloc的区别
- 【Java-1】写代码前的准备工作
- thinkPHP5隐藏入口文件index.php后 读取不到资源问题
- 机器学习基础:集成学习方法应用实验(RF、GBDT)
- Codeforecs 439D Devu and his Brother 三分
- jmap