题目大意:给你一串字符串,其中有一部分未知,用’?’表示。

现在定义一种合法的Sticker,比如”aabcc”,“ccccab”。即所有相同的字母要在一起才是合法的。现在请问对于给定的字符串,有多少种合法的结果。

比如:”aa??bb”合法的字符串有三种。

分别是“aaaabb” “aaabbb” ”aabbbb”.

‘?’表示的字符只能从已经给出的字符中选,所以”aaccbb”是不合法的。

由于最终结果很大,所以把结果对 1e9+7取模。

题目看懂之后思路就很明确了,一个组合问题。

分析一下:

1、相同字母需要在一起

2、只能从存在的字母中选。

显然的,‘?’只能从左边或者右边的字母中选取。

‘?’出现的情况有一下几种(打引号好累):???xx   xxx??   xx??xx   xx?yy

第一种和第二种是一样的,因为出现在序列首/尾部。这两种情况只有1种。

第三种:只有一种,必须和x一样。

第四种:这个情况比较多,但是很容易感觉到会与‘?’的个数有关,来找下规律

aaa?bbb   长度 1    种数 2   aaaabbb   aaabbbb

aaa??bbb  长度 2    种数 3   aaaaabbb  aaaabbbb  aaabbbbb

aaa???bbb 长度 3    种数 4   aaaaaabbb aaaaabbbb aaaabbbbb aaabbbbbb

规律很快就的出来了,种数 = 长度 + 1。

好了,所有‘?’出现的情况都分析过了,下面利用组合数学的知识,对于每一部分‘?’的种数应该乘起来求组合数。只需要在乘的过程中记得对mod取余,防止溢出就好了~

等下,是不是还忘记了一种情况。

我们默认认为数据都是合法的字符串,但是如果给你的就是一个不合法的字符串,那么这时候就应该输出0。

下面附上代码:

/*
* Problem: A
* Date: 2014-7-20
* Author: Wuhen
*/
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <cstdarg>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define LL long long
#define Clean(a) memset(a, 0, sizeof(a)) using namespace std;
bool vis[300];
const LL mod = 1e9+7;
LL deal(LL len, char l, char r)
{
if (l == r) return 1;
else return (len+1)%mod;
} int main()
{
LL T;
cin >> T;
while(T--)
{
string s;
cin >> s;
Clean(vis);
LL all = 0;
for (LL i = 0; i < s.size(); i++)
{
if (s[i] == '?') continue;
if (vis[s[i]] == 0)
{
all += 1;
vis[s[i]] = 1;
}
else
{
LL find = i-1;
while(s[find] == '?' && find >= 0) find--;
if (s[find] != s[i])
{
all = 0;
break;
}
}
}
if (all == 0)
{
puts("0");
continue;
}
LL res = 1;
LL start = 0, stop = s.size() - 1;
while(s[start] == '?' && start < s.size()) start++;
while(s[stop] == '?' && stop >= 0) stop--;
for (LL i = start; i <= stop; i++)
{
if (s[i] != '?') continue;
char left = s[i-1];
LL len = 0;
while(s[i] == '?' && i <= stop)
{
len++;
i++;
}
res *= deal(len, left, s[i]);
res %= mod;
}
cout << res%mod << endl;
}
return 0;
}

The Alphabet Sticker的更多相关文章

  1. 字符串-Alphabet

    在一些应用当中,会对字符串的字母表进行限制,在这些应用中,往往会用到如下的示例所涉及到的几点知识: public static void main(String[] args){ String[] a ...

  2. Sticker.js – 帮助你在网站中加入贴纸效果

    Sticker.js 是一个很小的 JavaScript 库,它允许您在网页中创建漂亮的贴纸效果.没有依赖关系(不需要 jQuery),可以在大多数支持 CSS3 的主流浏览器工作.下面有简单的使用示 ...

  3. session204 imessageApp sticker part I要点

    session204 imessageApp sticker partI 工程文件:https://developer.apple.com/library/prerelease/content/sam ...

  4. Codeforces Round #337 Alphabet Permutations

    E. Alphabet Permutations time limit per test:  1 second memory limit per test:  512 megabytes input: ...

  5. sticker.js贴纸效果

    http://stickerjs.cmiscm.com/ <div class="sticker gbtags"></div> <!-- 引用Java ...

  6. Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products

    Amazon.com: NEW VI AND VIM EDITOR KEYBOARD STICKER: Office Products NEW VI AND VIM EDITOR KEYBOARD S ...

  7. App Extensions篇之Sticker Pack Extension

    转载请标明原文链接:http://www.cnblogs.com/zhanggui/p/7151795.html 前言 上一篇文章对App Extension做了简单介绍以及对Share Extens ...

  8. 福布斯最佳雇主榜:谷歌母公司Alphabet再登榜首 微软次之

    http://www.sohu.com/a/259018538_114774 站长之家(ChinaZ.com) 10月12日 消息:在福布斯发布的最新全球最佳雇主榜单中,谷歌母公司Alphabet以满 ...

  9. English Phonetic Spelling Alphabet

    https://www.englishclub.com/vocabulary/english-phonetic-spelling.htm When speaking on the telephone ...

随机推荐

  1. Linux服务器上监控网络带宽的18个常用命令和工具

    一.如何查看CentOS的网络带宽出口 检查维护系统的时候,经常会要查看服务器的网络端口是多大的,所以需要用到Linux的一个命令. 如何查看CentOS的网络带宽出口多大?可以用下面的命令来查看. ...

  2. npm 安装文件 运行报错 %1 is not a valid Win32 application

    安装了那个模板出了错报这样的错误 “%1 is not a valid Win32 application” 你就除那个模板新安装. 如下例: 运行 npm install -g @angular/c ...

  3. crond 的注意点

    本来在控制台调试的好好的程序,一通过crond运行, 就执行不了. 一般需要注意: 1) 环境变量 当前目录 会变成用户的Home 2)  /var/log/messages 可以看出 crond 调 ...

  4. 关于一致性hash详细

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  5. Confluence 6 使用 LDAP 授权连接一个内部目录概述

    你可以为你的 Confluence 连接 LDAP 服务器使用使用委托认证.这个意思是 Confluence 将会设置一个内部目录,这个目录仅被用来处理 LDAP 的授权. 这个设置将会为尝试登录系统 ...

  6. Oracle11g温习-第九章:表空间和数据文件管理

    2013年4月27日 星期六 10:37 1.tablespace 功能:从逻辑上简化数据库的管理 2.tablespace 概述 一个database 对应多个tablespace ,一个table ...

  7. 42. Trapping Rain Water *HARD*

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  8. 一、final关键字

    final关键字修饰:类,方法,基本类型变量,引用,具有不同的意思 1.final修饰类 表示该类不能被继承 package property; public final class Hero ext ...

  9. poj 2777线段树应用

    敲了n遍....RE愉快的debug了一晚上...发现把#define maxn = 100000 + 10 改成 #define maxn = 100010 就过了....感受一下我呵呵哒的表情.. ...

  10. learning shell script prompt to run with superuser privileges (4)

    Shell script prompt to run with superuser privileges [Purpose]        Check whether have root privil ...