题面不给……题意:找出合法字符串填法。
明显是个思博线性递推这都推不出来简直智硬$O(n)$搞啊……
但是细节成功绝杀……考虑字符为$1$时,需要分开考虑地雷在前在后的情况……
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=(int)1e6+5,mod=(int)1e9+7; 7 char s[maxn];int f[maxn][5];//0 0 1 2 2 * 3 1* 4 *1 8 int haha() 9 { 10 scanf("%s",s+1);int n=strlen(s+1); 11 if(s[1]=='?')f[1][0]=f[1][2]=f[1][3]=1; 12 else if(s[1]=='0')f[1][0]=1; 13 else if(s[1]=='1')f[1][3]=1; 14 else f[1][2]=1; 15 for(int i=2;i<=n;i++) 16 { 17 if(s[i]=='*')f[i][2]=((f[i-1][3]+f[i-1][2])%mod+f[i-1][1])%mod; 18 else if(s[i]=='0')f[i][0]=(f[i-1][4]+f[i-1][0])%mod; 19 else if(s[i]=='2')f[i][1]=f[i-1][2]; 20 else if(s[i]=='1')f[i][3]=(f[i-1][4]+f[i-1][0])%mod, 21 f[i][4]=f[i-1][2]; 22 else 23 { 24 f[i][0]=(f[i-1][4]+f[i-1][0])%mod; 25 f[i][1]=f[i-1][2]; 26 f[i][2]=((f[i-1][3]+f[i-1][2])%mod+f[i-1][1])%mod; 27 f[i][3]=(f[i-1][4]+f[i-1][0])%mod; 28 f[i][4]=f[i-1][2]; 29 } 30 } 31 printf("%d ",((f[n][0]+f[n][2])%mod+f[n][4])%mod); 32 } 33 int sb=haha(); 34 int main(){;}