TJOI2017DNA
- 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的更多相关文章
- BZOJ4892 Tjoi2017dna(后缀数组)
对每个子串暴力匹配至失配三次即可.可以用SA查lcp.然而在bzoj上被卡常了.当然也可以二分+哈希或者SAM甚至FFT. #include<iostream> #include<c ...
- [JZOJ5897]密匙--哈希骚操作
[JZOJ5897]密匙--哈希骚操作 题目链接 太懒了自行Google 前置技能 二分/倍增求LCP e.g TJOI2017DNA 分析 这题看了样例解释才知道什么意思 本以为自己身为mo法师蛤希 ...
- FFT专练
就多项式乘法这个地方不太熟 再多巩固一下. LINK:[ZJOI2014力](https://www.luogu.com.cn/problem/P3338) 把$(j-i)^2$看成一个函数 可以发现 ...
随机推荐
- flutter column row布局的列表自适应宽高
mainAxisSize: MainAxisSize.min
- beego 注解路由
场景描述:使用注解路由,不起作用. 额外描述: 路由的添加都写在 main函数中了,同时未设置 beego.BConfig.RunMode ="dev"也未引入 :routers包 ...
- GET 和 POST 区别?网上多数答案都是错的!
最近在看<HTTP权威指南>这本书,对HTTP协议有了更深一层的了解. 在我们面试过程中关于HTTP协议有两个经典的面试题: 1. 谈谈HTTP中GET与POST的区别. 2. 在浏览器中 ...
- VGA显示正圆
接着上次的随笔,既然VGA时序已经实现了,那么就显示点东西看看吧. 想显示个圆,但是无从下手,参考了这篇文章:https://user.qzone.qq.com/1241003385/blog/154 ...
- 【OpenCV开发】OpenCV:使用VideoCapture类进行视频读取和显示
原文来自:http://blog.csdn.net/thefutureisour/article/details/7530344 -------------以下为原文---------------这次 ...
- JS实现网页选取截屏 保存+打印 功能(转)
源码地址: 1.1 确定截图选取范围 用户在开始截图后,需要在页面上选取一个截图范围,并且可以直观的看到,类似如下效果: image 我们的选取范围就是鼠标开始按下的那个点到鼠标拖动然后松开的那个点之 ...
- value(C# )
上下文关键字 value 用在普通属性声明的 set 访问器中. 此关键字类似于方法的输入参数. 关键字 value 引用客户端代码尝试分配给属性的值. 在以下示例中,MyDerivedClass 有 ...
- ElasticSearch 7.3.0 查询、修改、删除 文档操作
PUT chuyuan/_doc/ { "name":"xiaolin", , "sex":"F", "lov ...
- Java实验报告四
一.实验目的 (1)掌握类的继承方法: (2)变量的继承和覆盖,方法的继承.重载和覆盖实现: 二.实验内容 1)实验代码 import java.util.Scanner; public class ...
- hue的load balance
参考: hue的load balance官网: https://www.cloudera.com/documentation/enterprise/6/6.2/topics/hue_use_add_l ...