列表

详情


NC253158. 小红过61

描述

小红拿到了一个仅由数字字符组成的字符串。她准备选择一个非空子序列,使得该子序列中不包含连续的"61"子串。
小红想知道,有多少种不同的子序列选择方式?答案对10^9+7取模。

输入描述

一个仅由数字组成的字符串,长度不超过10^5

输出描述

满足题目条件的子序列数量。

示例1

输入:

12

输出:

3

说明:

有3个非空子序列,均符合条件。

示例2

输入:

654321

输出:

62

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 644K, 提交时间: 2023-06-01 23:15:18

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int mod=1e9+7;

signed main()
{
    string s;
    cin>>s;
    int ans=0,q=0;
    for(int i=0;i<s.length();i++){
        if(s[i]=='1'){
            ans=(2*ans+1-q+mod)%mod;
        }else{
            if(s[i]=='6') q=(q+ans+1)%mod;
            ans=(2*ans+1)%mod;
        }
    }
    cout<<(ans+mod)%mod;
}

C++(clang++ 11.0.1) 解法, 执行用时: 6ms, 内存消耗: 672K, 提交时间: 2023-06-02 00:01:18

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
signed main(){
    int a[2]={1};
    string s;cin>>s;
    for(auto c:s){
        if(c=='1')a[0]=(a[0]*2)%mod;
        else if(c=='6')a[1]=(a[0]+a[1]*2)%mod;
        else a[0]=(a[0]*2+a[1])%mod;
    }
    cout<<(a[0]+a[1]+mod-1)%mod;
}

pypy3 解法, 执行用时: 83ms, 内存消耗: 22216K, 提交时间: 2023-06-03 17:09:33

import sys
input = lambda: sys.stdin.readline().strip()
s = input()
MOD = 10**9+7
# f: 遍历到当前位置的合法子序列个数
# g: 遍历到当前位置的所有以6为结尾的子序列个数
f = g = 0
for i, c in enumerate(s):
    if c == '1':
        f += f+1-g 
    else:
        if c == '6':
            g += f+1
        f += f+1
    f %= MOD
    g %= MOD
print(f)

Python3 解法, 执行用时: 81ms, 内存消耗: 4796K, 提交时间: 2023-06-01 22:26:40

s = input()
MOD = 10**9+7
cur = 1
six = 0
for ch in s:
    if ch == '6':
        six += cur
        six %= MOD
    cur *= 2
    cur %= MOD
    if ch == '1':
        cur -= six
        cur %= MOD
print((cur - 1) % MOD)

上一题