Advertisement

上海市计算机学会竞赛平台2024年12月月赛丙组查找 404

阅读量:
题目描述

Eve 有一个字符串 SS,该字符串仅由字符 *40 组成。字符 * 可以被替换为 40

Eve 想要计算在所有可能通过替换 * 生成的字符串中,包含子序列 404 的总数。由于这个数字可能非常大,你需要其输出模 109+7109+7 的结果。

例如,当 SS 为 4*4* 时,可以替换为 4040,4044,4440,4444,其中分别有 1,2,0,01,2,0,0 个 404 子序列,共 33 个。

输入格式

第一行一个整数 TT 表示数据组数。对于每组数据:

第一行一个整数 nn 表示 SS 的长度。

第二行一个字符串 SS。

输出格式

对于每组数据,输出一行一个整数表示答案。

数据范围

对于 30%30% 的数据,1≤T≤101≤T≤10,1≤n,∑n≤101≤n,∑n≤10。

对于 60%60% 的数据,1≤T≤1001≤T≤100,1≤n,∑n≤1001≤n,∑n≤100。

对于 100%100% 的数据,1≤T≤1051≤T≤105,1≤n≤1051≤n≤105,1≤∑n≤1061≤∑n≤106,SS 中仅包含 40* 三种字符。

样例数据

输入:

2
4
404
4
4
4*

输出:

4
3

说明:

第二组数据即为题目描述中举的例子。

详见代码:

复制代码
 #include<bits/stdc++.h>

    
 using namespace std;
    
 int t, m, n;
    
 int mod = 1e9 + 7;
    
 long long dp4;
    
 long long dp40;
    
 long long dp404;
    
 long long p;
    
 int main() 
    
 {
    
     cin >> t;
    
     while(t--) 
    
     {
    
     dp4=0;
    
     dp40=0;
    
     dp404=0;
    
     p=1;
    
     cin >> n;
    
     string s;
    
     cin >> s;
    
     for(int i = 0; i < n; i++) 
    
     {
    
         if (s[i] == '4') 
    
         { 
    
             dp4 += p; 
    
             dp404 += dp40;
    
         }
    
       else if (s[i] == '0') 
    
         {
    
             dp40 += dp4; 
    
         } 
    
       else if (s[i] == '*') 
    
       { 
    
             dp404 = dp404 * 2 + dp40;
    
             dp40 = dp40 * 2 + dp4;
    
             dp4 = dp4 * 2 + p;
    
             p *= 2;
    
         }
    
         dp4 %= mod;
    
         dp40 %= mod;
    
         dp404 %= mod;
    
         p %= mod;
    
     }
    
     cout << dp404 << "\n";
    
     }
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~