首页 > 试题广场 >

游戏海报

[编程题]游戏海报
  • 热度指数:9916 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
小明有 26 种游戏海报,用小写字母 "a" 到 "z" 表示。小明会把游戏海报装订成册(可能有重复的海报),册子可以用一个字符串来表示,每个字符就表示对应的海报,例如 abcdea 。小明现在想做一些“特别版”,然后卖掉。特别版就是会从所有海报(26种)中随机选一张,加入到册子的任意一个位置。
那现在小明手里已经有一种海报册子,再插入一张新的海报后,他一共可以组成多少不同的海报册子呢?

数据范围:输入的字符串长度满足

输入描述:
海报册子的字符串表示


输出描述:
一个整数,表示可以组成的不同的海报册子种类数
示例1

输入

a

输出

51

说明

我们可以组成 'ab','ac',...,'az','ba','ca',...,'za' 还有 'aa', 一共 51 种不同的海报册子。 
"""
可在 (len(s) + 1)个位置插入26字符中的一个,
当插入相同字符时,放在前后只算一个,括号里表示插入的字符
例如 (a)aaa,a(a)aa,aa(a)a,aaa(a), 原来基础上减len('aaa')
"""
import sys

if __name__ == "__main__":
    # sys.stdin = open("input.txt", "r")
    s = input().strip()
    ans = (len(s) + 1) * 26 - len(s)
    print(ans)

发表于 2019-07-09 13:16:11 回复(2)
import sys
for line in sys.stdin:
    msize = len(line)-1
    print((msize+1)*26-msize)
这是一道排列问题,其中有固定顺序的字符串我们只需要知道他的长度即可,然后根据长度计算可以插空的位置个数再减去重复次数即可,例如字符串"a"在左边插入a和右边插入a都是"aa"因此重复了一次,可以推断重复次数和字符串个数相同。
发表于 2019-06-28 00:45:56 回复(0)
计算式:26*(len(a) + 1) - len(a) -> 25*len(a) + 26
推倒过程:
1. "a",左右都可插入26个字母,因此为26(1+1);减去重复计算的次数,1次。
2. "aa", 左中右,26(1+1+1);减去重复,2次。
以此类推,得 26*(len(a) + 1) - len(a)

C:
#include <stdio.h>
int main()
{
    char whatever;
    int a = 0;
    while(scanf("%c", &whatever)!=EOF) a++;
    printf("%d\n", 25*(a-1) + 26);
}
Python3:
print(25*len(input())+26)
编辑于 2020-04-06 16:35:35 回复(0)
假设输入字符串为"aabca",那么可知,当插入a时,因为a重复出现导致组合重复,互异的组合数需要减去重复的,插入a的方法数=6-3=3。再判断重复字母的连续性是否影响,考虑abaca,同样插入a的方法数为6-3=3。因为每一个字母有前后两种插入方式,而只有一个属于互异组合。记字符串长度为n,统计字符串中每个字母出现的次数ki,n+1-ki即为插入一个字母i+‘a’所形成的互异组合数,对26个字母求和即可。
发表于 2019-07-16 21:06:24 回复(0)
排列组合  已知N个元素,从26个元素中再选择1个,插入原来N个元素中,可以形成多少个元素。
N个元素构成(N+1)个间隙,最后在选择到相同元素时,存在重复的情形。
如ab,选择a或者b,会多计算2次。
26*(N+1)-N
发表于 2019-07-11 19:37:08 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
int l = s.length();
cout<<(l+1)*26 - l<<endl;
return 0;
}

发表于 2019-07-08 01:49:39 回复(0)
JAVA解答:这道题粗略的看有点难,不过把a,ab,aa,abc等列出来后就会发现,实际上就是(字母个数+1)25+1;找规律罢了。
import java.util.Scanner;
    
public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        int len = str.length();
        int sum = (len+1)*25+1;
        System.out.println(sum);
    }
}

编辑于 2019-08-02 19:34:13 回复(0)
1.根据原海报的长度可以知道,有 len(s)+1 个空位置可以插入新海报(26种字符可选)
2.但是插入的新海报字母与原海报字母相同的话,前后效果是一样的,所有需要去重。重复次数为原海报字母的个数(有多少个就会出现在26个字母多少次)即为长度len(s)
所有代码:
while True:
    try:
            s=input()
            sums=(len(s)+1)*26-len(s)
            print(sums)
    except:
        break

发表于 2021-03-14 16:34:26 回复(0)
import java.util.Scanner;

public class Main {
	
	public static int gameBill(String str){
		int len = str.length();
		if(len < 1 || len > 20){
			return 0;
		}
		// 有 len+1 个空位置可以插入新海报(26种字符可选),有 len 组重复的数据需要去掉
		return 26 * (len + 1) - len;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		System.out.println(gameBill(str));
                sc.close();
	}

}

编辑于 2020-08-10 17:29:08 回复(0)
package nowcoder.demo04;

import java.util.Scanner;

public class Main {
    
    /**
     * 运行时间:41ms
     *
     * 占用内存:10452k
     * */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String next = scanner.next();
        int length = next.length();
        System.out.println((length+1)*26-length);
    }
}

发表于 2020-02-28 20:43:25 回复(0)
向一个字母的前后插入新字母时注意到如果插入的新字母和该字母一样的话,插到该字母前面和后面的效果是一样的,要排除一种。其余情况就是排列组合的结果了。
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String booklet = sc.nextLine();
            System.out.println(calculateCombinations(booklet.length()));
        }
    }
    private static long calculateCombinations(int n){
        return (long) (n+1)*26-n;
    }
}


发表于 2020-02-27 15:35:53 回复(0)
package cn.bubbletg2.t01;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        String s = new Scanner(System.in).next();
        int length = s.length();
        if (length < 1 || length >= 20) return;
        int j = 0;
        for (int i = 1; i <= 26; i++) {
            /**
             * length + 1  表示每次可以插入位置个数, 只有一个 a   -a- 可以 ab  或者ba   两个位置
             *              长度为2时。  -a-b-   插入位置为3
             *
             * 为什么要26次?因为题目中已经给出 aa 也算,所有 其实相当于26个都可以进行。
             */
            j += (length + 1);
        }
        /**
         *为什么j- length   如题,    _a_   可以前后两个位置插入,但是插入a 时, aa 与 aa 算同一个
         *                      若 _a_b_    我们插入一个a   可能结果有    aab   aab  aba   我们在插入一个b    aab abb abb   
         *                      可以发现:  aab  与 aab   和 abb abb 重复了    长度为多少,重复多少次。所以减去长度。
         */
        System.out.println(j - length);


    }
}

欢迎各位指点批评。
发表于 2019-11-06 22:30:40 回复(1)
# 可以插入26个字母的位置有 insert_positions 个
insert_positions = len(input()) + 1
# 最后结果为可插入位置 * 26个字母 - 去重复的个数
print(insert_positions * 26 - (insert_positions - 1))

发表于 2019-09-09 17:07:33 回复(0)
就是找规律,输入为一个字符时,左右两边都可以插入26个字符中的一个,然后减去重复的(比如左插入aa,右插入aa),两个字符时三个插入点,_a_b_ ,26*3-3 
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        String str = s.next();
        int n = str.length(); // 输入的字符串长度
        
        // 非法输入处理
        if (n < 1 || n>20) {
            System.out.println("非法输入");
            return;
        }
        
        System.out.println(26*(n+1)-n);
    }
}


发表于 2019-08-08 15:47:26 回复(0)
/*
26个字母轮流***去。
原字符串中有几个字符和插入字符一样,就会有几个插入效果相同,所以要减去。
*/
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.next();
        int len = s.length();
        int ans = 0;
        int cnt = 0;
        String tmp = "abcdefghijklmnopqrstuvwxyz";
        for (int i = 0; i < 26; i++) {
            cnt = 0;
            for (int j = 0; j < len; j++) {
                if (tmp.charAt(i) == s.charAt(j))
                    cnt++;
            }
            ans += len + 1 - cnt;
        }
        System.out.println(ans);
    }
}

发表于 2019-06-28 14:35:31 回复(1)
高中数学的一个应用,插空法,n个数,形成n+1个格子,所有总的有26 *(n+1)中方法,问题的关键在于怎么找重复的。

以a为例,在a的旁边,每个a,有2种方法(左边插、右边插),但实际只算1种,所以对于a,要减去a出现的次数(无论所有的a是否相邻!);
以此类推,减去所有字符的出现次数,那就是减去字符串长度了。

26*(strlen(s) + 1) - strlen(s)

编辑于 2020-03-09 16:14:48 回复(0)
对于 a a b这样的组合,个数我们记为n,有n + 1,四个空位可以插入,所有的排列组合就有26 * (n + 1)种组合。我们再去掉重复的,组合只有一个b,当插入b的时候可以发现两种情况是一样的,所以两次只能算一次,要减掉一次,而组合中有两个a,插入a的时候,四种情况有两次是无效的,要减去两次。所以,不管排列是怎么的,有多少个字符重复,最后都要减去n。那么最终的结果就是 26 * (n + 1) - n
编辑于 2019-11-26 08:56:49 回复(0)
package main

import (
    "fmt"
)

var s string
var cnt map[string]int=map[string]int{}

func main() {    
    fmt.Scan(&s)
    var tmp string
    for i:=0;i<26;i++{
        str:=string(i+'a')
        for j:=0;j<=len(s);j++{
            tmp=s[:j]+str+s[j:]
            cnt[tmp]++
        }
    }
    fmt.Print(len(cnt))
}

发表于 2023-03-12 10:20:31 回复(0)
#include<iostream>
using namespace std;
int main()
{
    string s1;
    cin >> s1;
    int size = s1.size();
    int sum = 0;
    sum = (size + 1) * 26 - size;
    cout << sum << endl;
}
发表于 2022-09-23 15:19:16 回复(0)
#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    string str;
    cin >> str;
    printf("%d\n", (str.size()+1)*26-str.size());
    return 0;
}

发表于 2022-02-15 16:33:17 回复(0)