首页 > 其他 > 详细

[TJOI2017]DNA (FFT)

时间:2019-03-10 12:44:07      阅读:149      评论:0      收藏:0      [点我收藏+]

[Luogu3763]

FFT做字符串匹配即可,详见代码

// luogu-judger-enable-o2
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
    register LL x=0,f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
    return f*x;
}
inline char readc(){
    register char c=getchar();
    while(c==' '||c=='\n'||c=='\t') c=getchar();
    return c;
}

const int MAXN=6e5+5;
const double Pi=acos(-1);

struct cmpx{
    double x,y;
    inline cmpx(){}
    inline cmpx(double _x,double _y){x=_x,y=_y;}
    inline friend cmpx operator + (cmpx a,cmpx b){return cmpx(a.x+b.x,a.y+b.y);}
    inline friend cmpx operator - (cmpx a,cmpx b){return cmpx(a.x-b.x,a.y-b.y);}
    inline friend cmpx operator * (cmpx a,cmpx b){return cmpx(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
}A[MAXN],B[MAXN];

char s[MAXN],t[MAXN];
int cnt[MAXN];
int n,m,T,ans;

namespace F_F_T{
    int rev[MAXN],limit,l;
    inline void init(int n){
        for(limit=1,l=0;limit<=n;limit<<=1) l++;
        for(int i=0;i<limit;i++)
            rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    }
    inline void FFT(cmpx *A,int type){
        for(int i=0;i<limit;i++)
            if(i<rev[i]) swap(A[i],A[rev[i]]);
        for(int len=1;len<limit;len<<=1){
            cmpx Wn=(cmpx){cos(Pi/len),type*sin(Pi/len)};
            for(int i=0;i<limit;i+=(len<<1)){
                cmpx w=(cmpx){1,0};
                for(int j=0;j<len;j++,w=w*Wn){
                    cmpx x=A[i+j],y=w*A[i+len+j];
                    A[i+j]=x+y;
                    A[i+len+j]=x-y;
                }
            }
        }
        if(type==-1){
            for(int i=0;i<limit;i++) A[i].x/=limit;
        }
    }
}using namespace F_F_T;

inline void solve(char c){
    for(int i=0;i<limit;i++) A[i]=B[i]=cmpx(0,0);
    for(int i=0;i<n;i++) A[i].x=(s[i]==c);
    for(int i=0;i<m;i++) B[m-i-1].x=(t[i]!=c);
    FFT(A,1);FFT(B,1);
    for(int i=0;i<limit;i++) A[i]=A[i]*B[i];
    FFT(A,-1);
    for(int i=0;i<limit;i++) cnt[i]+=(int)(A[i].x+0.5);
}

int main(){
    T=read();
    while(T--){
        memset(cnt,0,sizeof cnt);
        ans=0;
        scanf("%s",s);scanf("%s",t);
        n=strlen(s),m=strlen(t);
        init(n+m-2);
        for(int i=0;i<4;i++) solve("ACGT"[i]);
        for(int i=m-1;i<n;i++) ans+=(cnt[i]<=3);
        printf("%d\n",ans);
    }
}

[TJOI2017]DNA (FFT)

原文:https://www.cnblogs.com/lizehon/p/10504853.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!