• P3763 [TJOI2017]DNA
  • 字符串匹配,字符集大小为\(4\),认为相差不超过\(3\)即合法。
  • 对每一种字符分开考虑不同产生的贡献。
  • 对于串\(S\),如果当前位置相同则\(S_i=1\),否则\(S_i=0\)。
  • 对于串\(T\)则相反。
  • 这样就保证了如果\(S\)串是字符\(str\),但是\(T\)串不是,那么就会产生\(1\)的贡献。
  • 然后\(ntt\)即可,不开\(O2\)要\(t\)成暴力,卡了好久。
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define R register int
#define ll long long
#define il inline
using namespace std;
const int N=100001;
const int M=300001;
const int mod=998244353;
const int Gi=3;
int t,n,m,inv,f[M],g[M],h[M],er,ans,lim=1,rd[M];
char S[N],T[N];
int Qpow(R x,R y){
R ans=1,bas=x;
while(y){
if(y&1)ans=1ll*ans*bas%mod;
bas=1ll*bas*bas%mod,y>>=1;
}return ans;
}
int gi(){
R x=0,k=1;char c=getchar();
while(c!='-'&&(c<'0'||c>'9'))c=getchar();
if(c=='-')k=-1,c=getchar();
while(c<='9'&&c>='0')x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*k;
}
void ntt(R *A,R op){
for(R i=0;i<lim;++i)if(i<rd[i])swap(A[i],A[rd[i]]);
for(R mid=1;mid<lim;mid<<=1){
R Wn=Qpow(Gi,(mod-1)/(mid<<1));
if(op==-1)Wn=Qpow(Wn,mod-2);
for(R len=mid<<1,j=0;j<lim;j+=len){
R W=1;
for(R k=0;k<mid;++k,W=1ll*W*Wn%mod){
R x=A[j+k],y=1ll*W*A[j+k+mid]%mod;
A[j+k]=(x+y)%mod,A[j+k+mid]=(x-y+mod)%mod;
}
}
}
}
void Do(char p){
for(R i=0;i<lim;++i)f[i]=g[i]=0;
for(R i=0,j=n-1;i<n;++i,--j)f[j]=(S[i]==p);
for(R i=0;i<m;++i)g[i]=(T[i]!=p);
ntt(f,1),ntt(g,1);
for(R i=0;i<lim;++i)f[i]=1ll*f[i]*g[i]%mod;
ntt(f,-1);
for(R i=0;i<lim;++i)h[i]=h[i]+1ll*f[i]*inv%mod;
}
void sol(){
scanf("%s",T),scanf("%s",S);
n=strlen(S),m=strlen(T),ans=er=0,lim=1;
while(lim<n+m)er++,lim<<=1;
for(R i=0;i<lim;++i)h[i]=0,rd[i]=(rd[i>>1]>>1)|((i&1)<<(er-1));
if(!inv)inv=Qpow(lim,mod-2);
Do('A'),Do('C'),Do('G'),Do('T');
for(R i=n-1;i<m;++i)ans+=(h[i]<=3);
printf("%d\n",ans);
}
int main(){
t=gi();while(t--)sol();
return 0;
}

TJOI2017DNA的更多相关文章

  1. BZOJ4892 Tjoi2017dna(后缀数组)

    对每个子串暴力匹配至失配三次即可.可以用SA查lcp.然而在bzoj上被卡常了.当然也可以二分+哈希或者SAM甚至FFT. #include<iostream> #include<c ...

  2. [JZOJ5897]密匙--哈希骚操作

    [JZOJ5897]密匙--哈希骚操作 题目链接 太懒了自行Google 前置技能 二分/倍增求LCP e.g TJOI2017DNA 分析 这题看了样例解释才知道什么意思 本以为自己身为mo法师蛤希 ...

  3. FFT专练

    就多项式乘法这个地方不太熟 再多巩固一下. LINK:[ZJOI2014力](https://www.luogu.com.cn/problem/P3338) 把$(j-i)^2$看成一个函数 可以发现 ...

随机推荐

  1. 【8】ie css hack

    1. "\9"   IE6/IE7/IE8/IE9/IE10都生效 "\0"   IE8/IE9/IE10都生效,是IE8/9/10的hack "\9 ...

  2. [Cinder] 存储 Qos

    目录 文章目录 目录 前言 操作步骤 参考文章 前言 Cinder 支持 front-end 和 back-end 两种类型的存储 QoS,前者由 Hypervisor 端实现(e.g. 通过 Lib ...

  3. MYSQL5.5源码包编译安装

    MYSQL5.5源码安装首先安装必要的库yum -y install gcc*###### 安装 MYSQL ######首先安装camke 一.支持YUM,则yum install -y cmake ...

  4. 修改ubuntu终端显示目录和计算机名称(转)

    注意:使用方法:# PS1='自定义内容' 注意两边的单引号 示例: PS1='(\u@\H \d \t)\$' ------------------------------------------- ...

  5. oop理论

    三大特性: 封装:把对象的属性和行为独立的一个整体,并尽可能的隐藏对象内部实现细节.增加安全性. 继承:从已有的类中派生出新的类,称为子类,子类继承父类的属性和行为,并能根据自己的需求扩展出新的行为. ...

  6. Logistic回归基础篇之梯度上升算法

    代码示例: import numpy as np import matplotlib.pyplot as plt def loadDataSet(): dataMat = [];labelMat = ...

  7. python 并发编程 多线程 死锁现象与递归锁

    一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等 ...

  8. MSF魔鬼训练营第一章 初识Metasploit

    1.1.4渗透测试过程环节 PTES标准7个阶段 1.前期交互阶段      收集客户需求.准备测试计划.定义测试范围与边界.定义业务目标.项目管理与规划等 2.情报搜集阶段      公开来源信息查 ...

  9. PostgreSQL INSERT ON CONFLICT不存在则插入,存在则更新

    近期有一个需求,向一张数据库表插入数据,如果是新数据则执行插入动作,如果插入的字段和已有字段重复,则更新该行对应的部分字段 1. 创建测试表 create table meta_data ( id s ...

  10. Solr 4.4.0安装

    软件包准备 JDK http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin Solr https://archi ...