95分,WAon#17求助
查看原帖
95分,WAon#17求助
147895
破壁人罗辑楼主2023/12/4 17:11
#include<bits/stdc++.h>
#define MOD 1000000007
using namespace std;
__int128 dna[100001][5][2];int l[5],n,m,k;
struct pHASH{
	__int128 operator()(pair<int,pair<__int128,__int128> > p)const{
		return p.first^(p.second.first<<28)^p.second.second;
	}
	__int128 operator()(pair<__int128,__int128> p)const{
		return p.first^(p.second<<28);
	}
};
unordered_map<pair<int,pair<__int128,__int128> >,int,pHASH> mp;
unordered_set<pair<__int128,__int128>,pHASH> vis;
long long search(int i,int le,__int128 val0,__int128 val1){
	if(i+le>n||(i==n&&le!=0))return 0;
	if(le==0)return 1;
	long long r=mp[make_pair(i,make_pair(val0,val1))];
	return ((i+le<n)?(r?r*search(i+1,le-1,val0,val1)%MOD:0)+search(i+1,le,val0,val1):(r?r*search(i+1,le-1,val0,val1):0))%MOD;
}
signed main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=0;i<n;i++){
		__int128 M=(((__int128)1)<<k)-1;
		char c=getchar();
		while(c!='A'&&c!='C'&&c!='G'&&c!='T')c=getchar();
		while(c=='A'||c=='C'||c=='G'||c=='T'){
			switch(c){
				case 'A':
					dna[l[i]+1][i][0]=((dna[l[i]][i][0]<<1)+1)&M;
					dna[l[i]+1][i][1]=((dna[l[i]][i][1]<<1)+1)&M;
					break;
				case 'T':
					dna[l[i]+1][i][0]=((dna[l[i]][i][0]<<1)+1)&M;
					dna[l[i]+1][i][1]=(dna[l[i]][i][1]<<1)&M;
					break;
				case 'G':
					dna[l[i]+1][i][0]=(dna[l[i]][i][0]<<1)&M;
					dna[l[i]+1][i][1]=((dna[l[i]][i][1]<<1)+1)&M;
					break;
				case 'C':
					dna[l[i]+1][i][0]=(dna[l[i]][i][0]<<1)&M;
					dna[l[i]+1][i][1]=(dna[l[i]][i][1]<<1)&M;
					break;
			}
			c=getchar();l[i]++;
		}
	}
	for(int i=0;i<n;i++)for(int j=k;j<=l[i];j++)mp[make_pair(i,make_pair(dna[j][i][0],dna[j][i][1]))]=(mp[make_pair(i,make_pair(dna[j][i][0],dna[j][i][1]))]+1)%MOD;
	long long ans=0;
	for(int be=0;be+m<=n;be++)for(int i=k;i<=l[be];i++)if(vis.find(make_pair(dna[i][be][0],dna[i][be][1]))==vis.end()){
		vis.insert(make_pair(dna[i][be][0],dna[i][be][1]));
		ans=(ans+search(be,m,dna[i][be][0],dna[i][be][1]))%MOD;
	}
	printf("%lld",ans);
    return 0;
}
2023/12/4 17:11
加载中...