80pts求调,有注释,玄关
查看原帖
80pts求调,有注释,玄关
169594
Heart_Of_Iron_4楼主2024/8/6 11:03

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[10000100][5][2],n,cnt,ans;
//dp i,j,k: now solve i:
//when j=1:place a simple 0~9 or a~z
//when j=2:place [
//when j=3:place ]
//when j=4:place * or +
//also,it means there isn't a useful [ before when k=0,and it means there's one when 1.
char a[10000100];
int mod=1000000007;
inline bool isdigitt(char k){return (k>='0'&&k<='9');}
inline bool islowerr(char k){return (k>='a'&&k<='z');}
signed main()
{
	scanf("%s",&a);
	n=strlen(a);
	for(int i=n-1;i>=0;--i)a[i+1]=a[i];
	dp[0][1][0]=1;
	for(int i=1;i<=n;++i)
	{
		cnt=0;
		if(a[i]=='?')cnt=36;
		else cnt=1;
		dp[i][1][0]=(dp[i-1][1][0]+dp[i-1][3][0]+dp[i-1][4][0])*cnt%mod;
		dp[i][1][1]=(dp[i-1][1][1]+dp[i-1][2][1])*cnt%mod;
		cnt=0;
		if(i>=3&&a[i-1]=='?')//<x>-<y>
		{
			cnt=0;
			if(a[i]=='?'&&a[i-2]=='?')cnt=13*25+5*9;
			else if(isdigitt(a[i-2])&&a[i]=='?')cnt='9'-a[i-2];
			else if(isdigitt(a[i])&&a[i-2]=='?')cnt=a[i]-'0';
			else if(islowerr(a[i-2])&&a[i]=='?')cnt='z'-a[i-2];
			else if(islowerr(a[i])&&a[i-2]=='?')cnt=a[i]-'a';
			else if((isdigitt(a[i])&&isdigitt(a[i-2])&&a[i]>a[i-2])
				||(islowerr(a[i])&&islowerr(a[i])&&a[i]>a[i-2]))cnt=1;
		}
		dp[i][1][1]=(dp[i][1][1]+(dp[i-3][1][1]+dp[i-3][2][1])*cnt)%mod;
		if(a[i]=='?')
		{
			dp[i][2][1]=(dp[i-1][1][0]+dp[i-1][4][0]+dp[i-1][3][0])%mod;
			dp[i][3][0]=dp[i-1][1][1]%mod;
			dp[i][4][0]=dp[i-1][3][0]*2%mod;//+/*
		}
	}
/*	for(int i=1;i<=n;++i)
	{
		printf("%lld,0:%lld %lld %lld %lld\n",
			i,dp[i][1][0],dp[i][2][0],dp[i][3][0],dp[i][4][0]);
		printf("%lld,1:%lld %lld %lld %lld\n",
			i,dp[i][1][1],dp[i][2][1],dp[i][3][1],dp[i][4][1]);
	}*/
	ans=(dp[n][1][0]+dp[n][3][0]+dp[n][4][0])%mod;
	printf("%lld",ans);
	return 0;
}
2024/8/6 11:03
加载中...