P4761 RE 50求助
  • 板块学术版
  • 楼主lovely_codecat
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/16 14:34
  • 上次更新2024/8/16 16:49:37
查看原帖
P4761 RE 50求助
775975
lovely_codecat楼主2024/8/16 14:34
#include<bits/stdc++.h>
using namespace std;
string s[4];
int n,t;
long long f[1000005][3][3],cnt[28][28][28][10][10],mod=1e9+9;
int cmp(int i,int j){
  if(i==j)return 1;
  if(i==26)return 0;
  if(j==26)return 2;
  return (i<j)?0:2;
}
int zip(char ch){
  if(ch >='a' && ch<='z')return ch - 'a';
  else if(ch=='?')return 27;
  else return 26;
}
main(){
	for(int i=0;i<=26;++i){
		for(int j=0;j<=26;++j){
			for(int k=0;k<=26;++k){
				int a=cmp(i,j);
				int b=cmp(j,k);
				vector<int>st[3];
				if(i<26)st[0]={i,27};
				else st[0]={26};
				if(j<26)st[1]={j,27};
				else st[1]={26};
				if(k<26)st[2]={k,27};
				else st[2]={26};
				for(auto A:st[0])for(auto B:st[1])for(auto C:st[2])cnt[A][B][C][a][b]++;
			}
		}
	}
	cin>>t;
	while(t--){
		cin>>s[0]>>s[1]>>s[2],s[0]=" "+s[0],s[1]=" "+s[1],s[2]=" "+s[2];
		n=0;
		int len[3]; 
		for(int i=0;i<=2;++i)len[i]=s[i].size()-1,n=max(n,len[i]);
		for(int i=len[0]+1;i<=n;++i)s[0][i]='a'-1;
		for(int i=len[1]+1;i<=n;++i)s[1][i]='a'-1;
		for(int i=len[2]+1;i<=n;++i)s[2][i]='a'-1;
		for(int i=0;i<=n;++i)for(int j=0;j<2;++j)for(int k=0;k<2;++k)f[i][j][k]=0;
		f[0][0][0]=1;
		for(int i=0;i<n;++i){
			int A=zip(s[0][i+1]);
			int B=zip(s[1][i+1]);
			int C=zip(s[2][i+1]);
			for(int j=0;j<2;++j){
				for(int k=0;k<2;++k){
					for(int n_j=0;n_j<3;++n_j){
						for(int n_k=0;n_k<3;++n_k){
							int j_=j,k_=k;
							if(!j_ && n_j==2||!k_ && n_k==2)continue;
							if(n_j==0)j_=1;
							if(n_k==0)k_=1;
							f[i+1][j_][k_]=(f[i+1][j_][k_]+f[i][j][k] * cnt[A][B][C][n_j][n_k])% mod;
						}
					}
				}
			}
		}
		printf("%lld\n",f[n][1][1]);
	}
}
2024/8/16 14:34
加载中...