zoukankan      html  css  js  c++  java
  • bzoj 4259

    与bzoj 4503是一个题,只是两个串都有通配符

    如果你没有做过那道题,请看这里

    接下来假设你知道这些前置知识了

    那么对于两个通配符,我们将表达式变成这样即可:

    $sum_{i=0}^{l}S_i*T_i*(S_i-T_i)^2==0$

    然后打开:

    $sum_{i=0}^{l}T_i*(S_i)^3+S_i*(T_i)^3-2*(S_i)^2*(T_i)^2==0$

    这次三项都得用卷积处理

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <stack>
    #define ll long long
    using namespace std;
    const double pi=acos(-1.0);
    struct cp
    {
        double x,y;
        friend cp operator + (cp a,cp b)
        {
            return (cp){a.x+b.x,a.y+b.y};
        }
        friend cp operator - (cp a,cp b)
        {
            return (cp){a.x-b.x,a.y-b.y};
        }
        friend cp operator * (cp a,cp b)
        {
            return (cp){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};
        }
    };
    char ssa[1000005],ssb[1000005];
    int sa[1000005],sb[1000005];
    int to[(1<<20)+5];
    int n,m,lim=1,l;
    void FFT(cp *a,int len,int k)
    {
        for(int i=0;i<len;i++)if(i<to[i])swap(a[i],a[to[i]]);
        for(int i=1;i<len;i<<=1)
        {
            cp w0=(cp){cos(pi/i),k*sin(pi/i)};
            for(int j=0;j<len;j+=(i<<1))
            {
                cp w=(cp){1,0};
                for(int o=0;o<i;o++,w=w*w0)
                {
                    cp w1=a[j+o],w2=a[j+o+i]*w;
                    a[j+o]=w1+w2,a[j+o+i]=w1-w2;
                }
            }
        }
    }
    cp a[(1<<20)+5],b[(1<<20)+5],c[(1<<20)+5];
    ll f[1000005],g[1000005],w[1000005];
    ll s3;
    int ret[1000005];
    int main()
    {
        scanf("%d%d",&n,&m);
        scanf("%s%s",ssb,ssa);
        n=strlen(ssa),m=strlen(ssb);    
        for(int i=0;i<n;i++)sa[i]=(ssa[i]=='*')?0:ssa[i]-'a'+1;
        for(int i=0;i<m;i++)sb[i]=(ssb[i]=='*')?0:ssb[i]-'a'+1;
        for(int i=0;i<n;i++)a[i].x=(double)sa[i]*sa[i]*sa[i];
        for(int i=0;i<m;i++)b[i].x=(double)sb[m-i-1];
        while(lim<=2*n)lim<<=1,l++;
        for(int i=1;i<lim;i++)to[i]=((to[i>>1]>>1)|((i&1)<<(l-1)));
        FFT(a,lim,1),FFT(b,lim,1);
        for(int i=0;i<lim;i++)c[i]=a[i]*b[i];
        FFT(c,lim,-1);
        for(int i=0;i<lim;i++)f[i]=(ll)(c[i].x/lim+0.5);
        memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)a[i].x=(double)sa[i];
        for(int i=0;i<m;i++)b[i].x=(double)sb[m-i-1]*sb[m-i-1]*sb[m-i-1];
        FFT(a,lim,1),FFT(b,lim,1);
        for(int i=0;i<lim;i++)c[i]=a[i]*b[i];
        FFT(c,lim,-1);
        for(int i=0;i<lim;i++)g[i]=(ll)(c[i].x/lim+0.5);
        memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)a[i].x=(double)sa[i]*sa[i];
        for(int i=0;i<m;i++)b[i].x=(double)sb[m-i-1]*sb[m-i-1];
        FFT(a,lim,1),FFT(b,lim,1);
        for(int i=0;i<lim;i++)c[i]=a[i]*b[i];
        FFT(c,lim,-1);
        for(int i=0;i<lim;i++)w[i]=2*(ll)(c[i].x/lim+0.5);
        int ans=0;
        for(int i=0;i+m-1<n;i++)if(f[i+m-1]+g[i+m-1]-w[i+m-1]==0)ans++,ret[ans]=i+1;
        printf("%d
    ",ans);
        for(int i=1;i<=ans;i++)printf("%d ",ret[i]);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    HTML5 实现Link跳线效果
    在TWaver的Tree节点上画线
    用TWaver加载大型游戏场景一例
    22万个木箱!TWaver 3D极限压榨
    如何在MONO 3D寻找最短路路径
    如何创建TWaver 3D的轮廓选中效果
    巧用TWaver 3D 矢量图形功能
    如何实现TWaver 3D颜色渐变
    HDU 1390 Binary Numbers
    HDU 1328 IBM Minus One
  • 原文地址:https://www.cnblogs.com/zhangleo/p/10809701.html
Copyright © 2011-2022 走看看