• ICPC 2023 网络赛 j (线性dp


    1. #include
    2. using namespace std;
    3. using VI = vector<int>;
    4. using ll = long long;
    5. const int mod = 998244353;
    6. //? 63
    7. //@ 64
    8. //a 97
    9. //z 122
    10. //Z 90
    11. //A 65
    12. int n;
    13. string s;
    14. //da xiao shu
    15. ll dp[2][2][2][2][100];
    16. ll sum[2][2][2];
    17. int change(char x){
    18. if(x == '?') return 1;
    19. else if(x >= 'A' && x <= 'Z'){
    20. return (int)x - 'A' + 2;
    21. }else if(x >= 'a' && x <= 'z'){
    22. return (int)(x - 'a') + 28;
    23. }else{
    24. return (int) x - '0' + 54;
    25. }
    26. }
    27. // ? 1
    28. // A - Z 2 27
    29. // a - z 28 53
    30. // 0 - 9 54 63
    31. int main(){
    32. cin>>n;
    33. cin>>s;
    34. s = " " + s;
    35. //1dp[0][0][0][0][1] = 1;
    36. int p = change(s[1]);
    37. if(p == 1){
    38. for(int k = 2 ; k <= 63 ; k++){
    39. if( k >= 2 && k <= 27){//daxie
    40. dp[1][1][0][0][k] = 1;
    41. }else if( k >= 28 && k <= 53){
    42. dp[1][0][1][0][k] = 1;
    43. }else if( k >= 54 && k <=63){
    44. dp[1][0][0][1][k] = 1;
    45. }
    46. }
    47. }else if(p >= 28 && p <= 53){
    48. dp[1][0][1][0][p] = 1;
    49. dp[1][1][0][0][p - 26] = 1;
    50. }else if(p >= 54 && p <= 63){
    51. dp[1][0][0][1][p] = 1;
    52. }else{
    53. dp[1][1][0][0][p] = 1;
    54. }
    55. for(int i = 2 ; i <= n; i++){
    56. int cur = i % 2;
    57. int pre = (i+1) % 2;
    58. int t = change(s[i]);
    59. memset(sum , 0 , sizeof sum);
    60. for(int j = 0 ; j <= 63 ; j++){
    61. for(int st1 = 0 ;st1 <= 1 ;st1++){
    62. for(int st2 = 0 ; st2 <= 1 ; st2++){
    63. for(int st3 = 0 ;st3 <= 1 ; st3++){
    64. dp[cur][st1][st2][st3][j] = 0 ;
    65. sum[st1][st2][st3] += dp[pre][st1][st2][st3][j];
    66. sum[st1][st2][st3] %= mod;
    67. }
    68. }
    69. }
    70. }
    71. if(t == 1){
    72. for(int k = 2 ; k <= 63 ;k++){
    73. if( k >= 2 && k <= 27){//daxie
    74. for(int st1 = 0 ;st1 <= 1; st1++){
    75. for(int st2 = 0;st2 <= 1; st2++){
    76. dp[cur][1][st1][st2][k] = dp[cur][1][st1][st2][k]
    77. + ((sum[0][st1][st2] - dp[pre][0][st1][st2][k] + mod) % mod + (sum[1][st1][st2] - dp[pre][1][st1][st2][k] + mod) % mod) % mod;
    78. dp[cur][1][st1][st2][k] %= mod;
    79. }
    80. }
    81. }else if( k >= 28 && k <= 53){
    82. for(int st1 = 0 ;st1 <= 1; st1++){
    83. for(int st2 = 0;st2 <= 1; st2++){
    84. dp[cur][st1][1][st2][k] = dp[cur][st1][1][st2][k]
    85. + ((sum[st1][0][st2] - dp[pre][st1][0][st2][k]) % mod + (sum[st1][1][st2] - dp[pre][st1][1][st2][k] ) % mod) % mod;
    86. dp[cur][st1][1][st2][k] %= mod;
    87. }
    88. }
    89. }else if( k >= 54 && k <=63){
    90. for(int st1 = 0 ;st1 <= 1; st1++){
    91. for(int st2 = 0;st2<=1;st2++){
    92. dp[cur][st1][st2][1][k] = dp[cur][st1][st2][1][k]
    93. + ((sum[st1][st2][0] - dp[pre][st1][st2][0][k]) % mod
    94. + (sum[st1][st2][1] - dp[pre][st1][st2][1][k]) % mod) % mod;
    95. dp[cur][st1][st2][1][k] %= mod;
    96. }
    97. }
    98. }
    99. }
    100. }else if( (t >= 2 && t<=27)){//大写字母的情况
    101. for(int st1 = 0 ; st1 <= 1; st1++){
    102. for(int st2 = 0; st2 <= 1; st2++){
    103. dp[cur][1][st1][st2][t] = dp[cur][1][st1][st2][t]
    104. + ((sum[0][st1][st2] - dp[pre][0][st1][st2][t]) % mod
    105. + (sum[1][st1][st2] - dp[pre][1][st1][st2][t]) % mod) % mod;
    106. dp[cur][1][st1][st2][t] %= mod;
    107. }
    108. }
    109. }else if(t >= 28 && t<= 53){//小写字母的情况
    110. for(int st1 = 0 ;st1 <= 1; st1++){
    111. for(int st2 = 0;st2 <= 1; st2++){
    112. dp[cur][st1][1][st2][t] = dp[cur][st1][1][st2][t]
    113. + ((sum[st1][0][st2] - dp[pre][st1][0][st2][t]) % mod
    114. + (sum[st1][1][st2] - dp[pre][st1][1][st2][t]) % mod) % mod;
    115. dp[cur][st1][1][st2][t] %= mod;
    116. }
    117. }
    118. t -= 26;
    119. for(int st1 = 0 ;st1 <= 1; st1++){
    120. for(int st2 = 0;st2 <= 1; st2++){
    121. dp[cur][1][st1][st2][t] = dp[cur][1][st1][st2][t]
    122. + ((sum[0][st1][st2] - dp[pre][0][st1][st2][t]) % mod
    123. + (sum[1][st1][st2] - dp[pre][1][st1][st2][t]) % mod) % mod;
    124. dp[cur][1][st1][st2][t] %= mod;
    125. }
    126. }
    127. }else if(t >= 54 && t<=63){//数字的情况
    128. for(int st1 = 0 ;st1 <= 1; st1++){
    129. for(int st2 = 0;st2<=1;st2++){
    130. dp[cur][st1][st2][1][t] = dp[cur][st1][st2][1][t]
    131. + ((sum[st1][st2][0] - dp[pre][st1][st2][0][t]) % mod
    132. + (sum[st1][st2][1] - dp[pre][st1][st2][1][t]) % mod) % mod;
    133. dp[cur][st1][st2][1][t] %= mod;
    134. }
    135. }
    136. }
    137. }
    138. ll res = 0 ;
    139. for(int i = 2 ; i <= 63 ; i++){
    140. res = (res + dp[n%2][1][1][1][i])%mod;
    141. }
    142. cout<< (res + mod) % mod;
    143. }

    因为输出的时候没有先加mod , 而wa,破大防

    因为转移的时候只关心上一个和  当前字母不同的  ,

    可以把上一个状态的所有和 求出来,然后把这个字母的状态去掉。

  • 相关阅读:
    Swift 5.5之Continuation
    《Vue入门到精通系列之五》--- vue-router详解
    03、自定义镜像上传阿里云
    【mac 解决eclipse意外退出】
    C语言 实现贪吃蛇 | 十分钟入门案例 | 初学者案例 | 附带设计思路 + 代码 + 图文分析
    都2022年了,还不知道如何学习Python的可以看过来(Python零基础入门必看)
    星邺汇捷实习工作日报(持续更新ing)
    报错 : UNRESOLVED DEPENDENCY:ORG.SPRINGFRAMEWORK:SPRING-WEBMVC-5.2.0.RELEASE
    【论文解读】Attentional Feature Fusion
    Java Math.abs()如何获取绝对值呢?
  • 原文地址:https://blog.csdn.net/m0_75125820/article/details/132957340