CF_528D
一句话题意
给你两个串s、t,长度为n、m,字符集为"ATGC",当且仅
当[i - k; i + k]中存在一个j,使得s[j ] = t[x]时,s[i ]可以
和t[x]匹配,问t总共能与s的几个子串匹配
首先,字符集只有4,那么,令s_A[i]=0/1 表示在s中i位置能否和A匹配,同理t_A[i];
一类关于通配符匹配的字符串问题都是可以用FFT来解决的
以A字符为例,令
\]
则当c[i]==D时 以S[i]为首的一个子串内的A的位置与T的A的位置相同
令
\]
代入原式,则
\]
成为了卷积形式
P.S. 也可以用bitset
#include<bits/stdc++.h>
using namespace std;
namespace Tzh{
typedef double dd;
const char ch[]="0ATCG";
const int maxn=700010;
const dd pi=acos(-1);
int ans,vis[maxn],x,y,k,rev[maxn],n=1,len,sum;
string S,T;
struct complex{
dd x,y;
complex operator +(const complex &b) const{
return (complex){x+b.x,y+b.y};
}
complex operator -(const complex &b) const{
return (complex){x-b.x,y-b.y};
}
complex operator *(const complex &b) const{
return (complex){x*b.x-y*b.y,x*b.y+y*b.x};
}
void init(){
x=0,y=0;
}
}s[maxn],t[maxn];
void init(){
for(int i=0;i<n;i++)
rev[i]=rev[i>>1]>>1|((i&1)<<(len-1));
}
complex omg(int x,int flag){
return (complex){cos((dd)x*2*pi/n),(dd)sin((dd)x*2*pi/n)*flag};
}
void FFT(complex *a,int type){
for(int i=0;i<n;i++) if(rev[i]>i) swap(a[i],a[rev[i]]);
for(int l=2,m=1;l<=n;m=l,l<<=1)
for(int i=0;i<n;i+=l)
for(int j=0;j<m;j++){
complex tt=omg(n/l*j,type)*a[i+j+m];
a[i+j+m]=a[i+j]-tt,a[i+j]=a[i+j]+tt;
}
if(type==-1)
for(int i=0;i<n;i++) a[i].x/=n;
}
void work(){
ios::sync_with_stdio(false);
cin>>x>>y>>k;
cin>>S>>T; for(int i=0;i<=x;i++) vis[i]=1;
while(n<=x+y) n<<=1,len++; init();
for(int j=1;j<=4;j++){ int num=0;
for(int i=0;i<S.size();i++){
if(S[i]==ch[j]) num++;
if(i>k&&S[i-k-1]==ch[j]) num--;
s[i].x=(dd)(num>0);
} num=0,sum=0;
for(int i=S.size()-1;i>=0;i--){
if(S[i]==ch[j]) num++;
if(i+k+1<S.size()&&S[i+k+1]==ch[j]) num--;
s[i].x=max(s[i].x,(dd)(num>0));
}
for(int i=0;i<T.size();i++)
t[y-i-1].x=(dd)(T[i]==ch[j]),sum+=(int)t[y-i-1].x;
FFT(s,1),FFT(t,1);
for(int i=0;i<n;i++) s[i]=s[i]*t[i]; FFT(s,-1);
for(int i=0;i<x;i++) if((int)((dd)s[y+i-1].x+0.5)!=sum) vis[i]=0;
for(int i=0;i<n;i++) s[i].init(),t[i].init();
}
for(int i=0;i<x;i++) ans+=vis[i];
cout<<ans<<endl;
return ;
}
}
int main(){
// freopen("1.in","r",stdin);
Tzh::work();
return 0;
}
CF_528D的更多相关文章
随机推荐
- 海康&大华&DSS视频拉流-RTSP转RTMP多媒体播放技术
海康&大华&DSS获取RTSP 实时流 海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/ ...
- vue中使用百度地图,悬浮窗搜索功能
https://www.cnblogs.com/shuaifing/p/8185311.html 侵删 <template> <div id="all"> ...
- windows2012R2安装SQL2005详情!
用友T3软件报错单据的时候提示1105数据库错误 原因分析:客户使用的是sql2005 express的数据库,账套的物理文件达到了4G. 只能重装SQL的版本,but.... 在window2012 ...
- C# 得到EXCEL表格中的有效行数和列数
每种方法中上面的是Excel的行数,下面的是Excel的列数.方法七:经过加工修改已经可以读出来的是有效数据行 using Excel = Microsoft.Office.Interop.Excel ...
- JAVA EE获取浏览器和操作系统信息
一.原理说明: 1. 浏览器访问服务端时,Http请求头上会带上客户端一些信息,可通过"user-agent"获取. //java获取方法如下,其他语言也有自己获取方法 Stri ...
- 我的Windows日常——炫酷的windows组件命令行打开方式
regedit -------注册表编辑器 gpedit.msc-------组策略编辑器 secpol.msc--------本地安全策略 control ----------控制面板 cmd--- ...
- python学习笔记2_条件循环和其他语句
一.条件循环和其他语句 1.print和import的更多信息. 1.1.使用逗号输出 //print() 打印多个表达式是可行的,用逗号隔开. 在脚本中,两个print语句想在一行输出 ...
- Map根据value值进行倒序排列
public List<Map.Entry<Integer,BigDecimal>> sortByMapValue(HashMap<Integer, BigDecimal ...
- .NET core2.0 发布至IIS中
.NET CORE和asp.net 发布时不太一样,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角 ...
- Hive JDBC:java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): User: root is not allowed to impersonate anonymous
今天使用JDBC来操作Hive时,首先启动了hive远程服务模式:hiveserver2 &(表示后台运行),然后到eclipse中运行程序时出现错误: java.sql.SQLExcepti ...