首页 > 试题广场 >

字符串解密

[编程题]字符串解密
  • 热度指数:1014 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个由字符 \texttt{`0'}\texttt{`1'} 构成的字符串 s。我们从字符串开头开始,按照长度依次取出以下子串并解析为十进制数:
\hspace{23pt}\bullet\, 长度 1 的子串;
\hspace{23pt}\bullet\, 长度 2 的子串;
\hspace{23pt}\bullet\, 长度 3 的子串;
\hspace{23pt}\bullet\, …;
\hspace{23pt}\bullet\, 长度 10 的子串;
\hspace{23pt}\bullet\, 然后循环回长度 1,依此类推;
\hspace{15pt}子串被取走后,视为删除,下一次从剩余的字符串中继续取子串,直到剩余字符不足以组成当前长度的子串。
\hspace{15pt}请输出解析得到的十进制数字序列。

输入描述:
\hspace{15pt}在一行上输入一个长度为 1\leqq {\rm len}(s) \leqq 10^{5},由字符 \texttt{`0'}\texttt{`1'} 构成的字符串 s


输出描述:
\hspace{15pt}第一行输出一个整数 p,表示解析得到的数字个数; 
\hspace{15pt}第二行输出 p 个整数,表示所有解析出的十进制数字,数字之间用空格隔开。
示例1

输入

0101001001010

输出

4
0 2 4 9

说明

\hspace{15pt}在这组样例中,s=\texttt{,依次切分并解析如下: 
\hspace{23pt}\bullet\, 长度 1 的子串 \texttt{ 转换为 0
\hspace{23pt}\bullet\, 长度 2 的子串 \texttt{ 转换为 2
\hspace{23pt}\bullet\, 长度 3 的子串 \texttt{ 转换为 4
\hspace{23pt}\bullet\, 长度 4 的子串 \texttt{ 转换为 9
\hspace{15pt}此后剩余字符长度不足以组成长度 5 的子串,故舍弃。
\hspace{15pt}因此总共解析得到 4 个数字,分别为 0,2,4,9
示例2

输入

100

输出

2
1 0
#include <iostream>
#include<vector>
using namespace std;
int turn(string st){
    int power=1,sum=0;
    for(int i=st.size()-1;i>=0;i--){
        if(st[i]=='1'){
            sum+=power;
        }
        power*=2;
    }
    return sum;
}
int main() {
    string s;
    cin>>s;
    int index=0,len=1;
    int sz=s.size();
    vector<int> ans;

    while(index+len<=sz){
        string st=s.substr(index,len);
        int shijin=turn(st);
        ans.push_back(shijin);
        index+=len;
        len=(len%10)+1;
    }
    cout<<ans.size()<<endl;
    for(int i=0;i<ans.size();i++){
        cout<<ans[i]<<" ";
    }
   


}
// 64 位输出请用 printf("%lld")
发表于 2025-11-28 09:24:00 回复(0)