• 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. ControlTemplate in WPF —— ListBox

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  2. MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators

    问题描述 通过Navicat客户端,创建MySQL函数(根据的当前节点查询其左右叶子节点)时报错,报错信息如下: This function has none of DETERMINISTIC, NO ...

  3. RTX和谐说明

    1.下载安装原版RTX20152.打开“服务”,停止RTX开头的服务.3.替换C:\Program Files\Tencent\RTXServer\License目录下的License.ini文件:替 ...

  4. 移动手机端通过PC转接实现标签打印的解决方案

    废话不多讲,由于种种原因项目上出现了移动手持录入标签信息通过pc端转接实现打印的需求,所以简单研究了一下,本来考虑使用webapi方式实现,但是发现这种方式调用打印机实现自动打印比较困难,所以转而求其 ...

  5. 【ABAP系列】SAP ABAP 关于FUNCTION-POOL的理解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 关于FUNCT ...

  6. oracle分页排序,点击下一页数据不刷新

    oracle数据库中,如果每一页的最后一条和次页第一条数据的排序字段重复,会导致排序混乱,出现点击下一页数据不刷新的现象,所以一般排序至少选择一个相对唯一的字段.在前端页面可以输入排序条件的场景中,最 ...

  7. Docker】如何修改Docker的默认镜像存储位置

    江湖有多大,坑就有多多……我使用的服务器, 系统盘根目录只有20G, 默认Docker 的镜像文件是安装在/var/lib/docker 目录下的, 这样的话我根本装不了太多的镜像,之前遇到一种情况就 ...

  8. jQ的toggle() 方法

    语法:$(selector).toggle(speed,callback,switch) 实例: <script src="js/jquery.min.js">< ...

  9. (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试

    背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...

  10. poj1011(DFS+剪枝)

    题目链接:https://vjudge.net/problem/POJ-1011 题意:给定n(<=64)条木棍的长度(<=50),将这些木棍刚好拼成长度一样的若干条木棍,求拼出的可能的最 ...