T^T online judge 2952

Problem Description

给一个01字符串求,这个字符串包含多少种不同的01字序列。

比如

101

有1,10,0,101,11,01,这6种不同的01子序列

Input

每个文件仅包含一个数据

第一行是一个整数n代表字符的长度

接下来一行是长度为n的01字符串

1<n<=1e6

Output

将结果对1e9+7取模后输出

SampleInput
 
SampleOutput
 
 
附上题目网址: http://www.fjutacm.com/Problem.jsp?pid=2952
 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define mem(x) memset(x, 0, sizeof(x))
using namespace std;
typedef long long LL;
const int MOD = 1e9 + 7;
/**
 8
 10000001
 
 ORZ 我旺神
 偷偷的看眼旺神的题解
 已知01字符串要么以1结尾或者以0结尾
 那么可知当前长度下以0结尾或者以1结尾
 都是由前面的以1结尾或者以0结尾来转移
 dp[i][0 or 1]
 dp[0][0] = dp[0][1] = 0;
 if(s[i] == 1)
 {
    dp[i][1] = dp[i - 1][0] + dp[i - 1][1] + 1;
    dp[i][0] = dp[i - 1][0];
 }
 else
 {
    dp[i][0] = dp[i - 1][0] + dp[i - 1][1] + 1;
    dp[i][1] = dp[i - 1][1];
 }
 **/
const int MAXN = 1e6 + 5;
char str[MAXN];
int n;
LL dp[MAXN][2];
int main()
{
    scanf("%d", &n);
    mem(str), mem(dp);
    scanf("%s", str);
    for(int i = 0; i < n; i ++)
    {
        if(str[i] == '1')
        {
            dp[i + 1][1] = (dp[i][0] % MOD + dp[i][1] % MOD + 1) % MOD;
            dp[i + 1][0] = dp[i][0] % MOD;
        }
        else if(str[i] == '0')
        {
            dp[i + 1][0] = (dp[i][0] % MOD+ dp[i][1] % MOD + 1) % MOD;
            dp[i + 1][1] = dp[i][1] % MOD;
        }
    }
    printf("%lld
", (dp[n][0] % MOD + dp[n][1] % MOD) % MOD);
    return 0;
}
原文地址:https://www.cnblogs.com/qq136155330/p/10692669.html