一、题目描述

假设一个字符串只由字符‘0’,‘1’,‘?’组成,其中字符‘?’表示该字符可由字符‘0’或‘1’替代。

现有一些字符串,根据这些字符串生成所有可生成的字符串。

如:{10,?1,0? }可生成{10,01,11,00}

{101,001,?01}可生成{101,001}

注意后一个例子中‘?01’并没有生成新的字符串。

二、输入

输入包含多组测试数据。

每组数据的第一行是两个整数M,N(1≤M≤15,0≤N≤2500)。M表示字符串的长度,N表示字符串的个数。两个整数之间由一个空格隔开。以下N行每行各有一个字符串。文件中各行的行首、行末没有多余的空格。

当M=N=0时表示输入结束。

三、输出

对于每组测试数据输出一行,为一个整数Total,表示所能生成的字符串的个数。

例如:

输入:

2 3

10

?1

0?

3 3

101

001

?01

0 0

输出:

4

2

四、解题思路

1、用十进制标记字符串

对于每一个字符串,使用一个数字来表示。输入的字符串相当于多位的二进制编码(因为字符串中只有0、1,虽然有出现“?”,但也要用0,1替换)。例如:

带有“?”的替换:

例如:10?0替换成:1010,1000。

2、使用数组保存出现过得字符串

假设字符串的长度为M,那么使用长度为2^M的布尔型数组strArray存储(数组下标对应该数)某个数(对应字符串)是否出现过。例如:当M等于3时,strArray[9]等于true时,表示1001已经出现过。

3、处理一个字符串多个”?”问题

假设字符串长度为5,对于字符串:1?0??。

首先创建一个队列tempQueue。当输入字符串的(坐起)第一位是,如果该字符是1,求出1*2^4=16。结果16进入队列。

继续下一位?,队列中的数分别出队列。对于“?”,分别使用1和0替换,即16+1*2^3=24入队;16+0*2^3=16入队;

继续下一位,如果是出现0,直接跳过(因为0对数值没有任何影响);

到左起第4位队首24出队24+1*2^1=26入队;24+0*2^1=24入队;16出队,16+1*2^1=18入队;16+0*2^1=16入队…以此类推计算完所有的位数。

五、代码

#include<iostream>
#include<queue>
#include<math.h> using namespace std; int main()
{
int strLeng, strCount; int result;
cin >> strLeng >> strCount;
while(strLeng)
{
bool strArray[1 << 16] = {false};
result = 0;
for(int i = 0; i < strCount; i++) //待输入字符串的个数
{
queue<int> tempQueue;
tempQueue.push(0);
for(int j = strLeng; j > 0; j--) //逐个计算字符串中的各个字符(累加)
{
char nowChar;
cin >> nowChar;
int queueLeng = tempQueue.size();
for(int n = 0; n < queueLeng; n++)
{
int top = tempQueue.front();
tempQueue.pop();
if(nowChar == '0') //0字符
{
tempQueue.push(top);
}else if(nowChar == '1') //1字符
{
int addNum = pow(2,j-1);
top += addNum;
tempQueue.push(top);
}else if(nowChar == '?') //?字符
{
tempQueue.push(top);
int addNum = pow(2,j-1);
top += addNum;
tempQueue.push(top);
}
} } while(!tempQueue.empty()) //把出现过得十进制(下标对应)赋值为rue
{
int top = tempQueue.front();
tempQueue.pop();
strArray[top] = true;
} } for(int i = 0; i < pow(2, 16); i++) //累计出现过得
{
if(strArray[i]) result++;
} cout << result << endl; cin >> strLeng >> strCount;
} return 0;
}

<Sicily> 生成字符串的更多相关文章

  1. C# 生成字符串的 CheckSum

    C# 生成字符串的 CheckSum private static string CheckSum(string message) { char[] chars = message.ToCharArr ...

  2. [SCOI2010]生成字符串

    题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足 ...

  3. c# .Net随机生成字符串代码

    /// <summary> /// 随机生成字符串 /// </summary> /// <param name="OperationType"> ...

  4. [SCOI2010]生成字符串 题解(卡特兰数的扩展)

    [SCOI2010]生成字符串 Description lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数 ...

  5. RandomStringUtils工具类(java随机生成字符串)

    使用RandomStringUtils可以选择生成随机字符串,可以是全字母,全数字,自定义生成字符等等... 其最基础的方法: 参数解读: count:需要生成的随机串位数 letters:只要字母 ...

  6. P1641 [SCOI2010]生成字符串

    P1641 [SCOI2010]生成字符串 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不 ...

  7. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  8. BZOJ1856 [SCOI2010]生成字符串 【组合数】

    题目 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhgww想要知道满足要求 ...

  9. 【2018寒假集训Day 1】【位运算】生成字符串

    生成字符串(strs) [问题描述] 假设字符串只由字符“0”,“1”,“”组成,其中字符“”表示该字符可由 字符“0”或“1”替代. 现有一些字符串,根据这些字符串生成所有可生成的字符串.如: {1 ...

随机推荐

  1. html 标签: image也能提交form!!!

    html 标签: image也能提交form! !! image也能提交form 先前常常使用"<input type="submit" value="i ...

  2. vue-cli全引入jquery

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 vue-cli全引入jquery:(vue-cli使用webpack) 第一步: 在package.json文件里的de ...

  3. Java8 方法引用与构造器引用,数组引用

    package java_8; import org.junit.Test; import java.io.PrintStream; import java.util.Comparator; impo ...

  4. java 后台实现ajax post跨域请求传递json格式数据获取json数据问题

    参考大神:http://blog.csdn.net/chunqiuwei/article/details/19924821 java后台: public String ajaxProxy(Intege ...

  5. HD-ACM算法专攻系列(8)——排序

    题目描述: 源码: #include"iostream" #include"string" using namespace std; void Order(in ...

  6. HTML基础——网站图片显示页面

    1.图片标签 <img /> 属性: src:指的是图片显示的路径(位置) 绝对路径:D:\Pictures\Saved Pictures 相对路径: ①同一级:直接写文件名称或者./文件 ...

  7. js中es5 使用call方法继承实现 1.0

    function Parent(name){ this.name = name; this.showMess = function(){ return this.name; } } Parent.pr ...

  8. hiho 1604 - 股票价格,思维题

    题目链接 题目大意 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格 ...

  9. A. Amr and Music

    解题思路:给出n种乐器学习所需要的时间,以及总共的天数, 问最多能够学多少门乐器,并且输出这几门乐器在原序列中的序号(不唯一) 按照升序排序,为了学到最多的乐器,肯定要选择花费时间最少的来学习 然后用 ...

  10. php 扩展 suhosin 配置不当引发的报错及其解决方法

    1. /var/log/messages 频繁报错: Jul :: localhost suhosin[]: ALERT - script tried to increase memory_limit ...