列表

详情


NC15703. Xieldy And His Password

描述

众所周知,Xieldy最常用的口令是******。
为了改变这一现状,他random了一个01串,并从中截取了一段作为自己的口令。
他选择的口令满足以下条件:
1. 口令串表示的二进制数在十进制下可以被表示为3k(k>=0)。
2. 口令串可以有前导零。
现已经random出了01串,他想知道有多少种口令方案可以选择(不同的子段即为不同)。

输入描述

若干组数据,每组数据仅一行01串s,表示random出来的的串,|s|<=1e6。

输出描述

输出口令的方案数。

示例1

输入:

101010

输出:

5

原站题解

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

C++(clang++ 11.0.1) 解法, 执行用时: 100ms, 内存消耗: 2464K, 提交时间: 2022-10-11 19:03:25

#include<bits/stdc++.h>
using namespace std;
int sum,n;
string s;
long long mp[3];
long long ans;
int main()
{
    while(cin>>s){
        mp[0]=mp[1]=mp[2]=sum=ans=0;
        n=s.size();
        mp[0]++;
        for(int i=0;i<n;i++){
            int k=(i&1)?1:2;
            sum=(sum+k*(s[i]-'0'))%3;
            ans+=mp[sum];
            mp[sum]++;
        }
        cout<<ans<<endl;
    }
}

pypy3 解法, 执行用时: 673ms, 内存消耗: 206472K, 提交时间: 2022-03-31 22:06:38

while 1:
    try:
        s = list(input())
        ans = 0
        c0=0
        c1=0
        c2=0
        for i in range(len(s)):
            if s[i]=='0':
                c0+=1
                c1,c2=c2,c1
            elif s[i]=='1':
                c0,c1=c1,c0
                c1+=1
            ans+=c0
        print(ans)
    except:
        exit()

上一题