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

现在定义一种合法的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. angular编译机制

    转载https://segmentfault.com/a/1190000011562077 Angular编译机制 前言 http://www.cnblogs.com/ztwBlog/p/620975 ...

  2. C++ 多态性和虚函数

    2017-06-27 19:17:52 C++面向对象编程的一个重要的特性就是多态性,而多态性的实现需要依赖虚函数的帮助. 一.多态的作用: 隐藏实现细节,使得代码能够模块化: 接口重用,实现“一个接 ...

  3. C#读写记事本(txt)文件

    C#写入记事本(txt)文件方法一: FileStream stream = new FileStream(@"d:\aa.txt",FileMode.Create);//file ...

  4. php json josn_decode()返回的是对像,如何把对像转成数组

    php json josn_decode()返回的是对像,如何把对像转成数组 a.php传值页面,使用 json_encode($array)对数组进行加密码. b.php页面在接收a.php传过来的 ...

  5. 5-15 devise(git指南,部分认为重要的内容的译文)

    git指南:https://github.com/plataformatec/devise 维基百科上有how to 的很多文章. Stackoverflow有大量问题的答案. 全的文档devise: ...

  6. Confluence 连接到一 LDAP 目录,权限对本地用户组设置为只读

    https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory

  7. java 中利用异或实现两个变量互换

    一般实现两个变量之间的互换要用第三个变量,这样做可以,但创建新变量,增加了系统开销.如果要交换的变量时两个整数型变量,可以用更高效的方法.例如:^(异或)操作,举例如下: package chapte ...

  8. ADO.NET 体系结构

    两个部分 .NET 数据提供者 DataSet 数据提供者 SqlClient 提供者 OleDb 提供者 Odbc 提供者 数据提供者组件 数据对象 DataSet

  9. .net 中struct(结构)和class(类)的区别

    1.struct 结构与class(类)的区别 1)struct是值类型,class是对象类型 2)struct不能被继承,class可以被继承 3)struct默认访问权限是public,而clas ...

  10. jsp jstl的使用

    1)下载jstl.jar和standard.jar文件,然后将其拷贝到tomcat的lib目录下. 具体的下载地址:http://mirrors.ccs.neu.edu/Apache/dist/jak ...