The Alphabet Sticker
题目大意:给你一串字符串,其中有一部分未知,用’?’表示。
现在定义一种合法的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的更多相关文章
- 字符串-Alphabet
在一些应用当中,会对字符串的字母表进行限制,在这些应用中,往往会用到如下的示例所涉及到的几点知识: public static void main(String[] args){ String[] a ...
- Sticker.js – 帮助你在网站中加入贴纸效果
Sticker.js 是一个很小的 JavaScript 库,它允许您在网页中创建漂亮的贴纸效果.没有依赖关系(不需要 jQuery),可以在大多数支持 CSS3 的主流浏览器工作.下面有简单的使用示 ...
- session204 imessageApp sticker part I要点
session204 imessageApp sticker partI 工程文件:https://developer.apple.com/library/prerelease/content/sam ...
- Codeforces Round #337 Alphabet Permutations
E. Alphabet Permutations time limit per test: 1 second memory limit per test: 512 megabytes input: ...
- sticker.js贴纸效果
http://stickerjs.cmiscm.com/ <div class="sticker gbtags"></div> <!-- 引用Java ...
- 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 ...
- App Extensions篇之Sticker Pack Extension
转载请标明原文链接:http://www.cnblogs.com/zhanggui/p/7151795.html 前言 上一篇文章对App Extension做了简单介绍以及对Share Extens ...
- 福布斯最佳雇主榜:谷歌母公司Alphabet再登榜首 微软次之
http://www.sohu.com/a/259018538_114774 站长之家(ChinaZ.com) 10月12日 消息:在福布斯发布的最新全球最佳雇主榜单中,谷歌母公司Alphabet以满 ...
- English Phonetic Spelling Alphabet
https://www.englishclub.com/vocabulary/english-phonetic-spelling.htm When speaking on the telephone ...
随机推荐
- windows下的mongodb安装(真垃圾)
一.下载 3.6下载安装会卡死.只能下3.4的.http://downloads.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-v3.4-la ...
- Paket介绍
在国外.NET社区有一个很火的话题是Packet(https://fsprojects.github.io/Paket/index.html ),它本质上是Nuget 之外的另一种方式管理.NET项目 ...
- 二分检索函数lower_bound()和upper_bound()
二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...
- Python获取脚本所在目录的正确方法(转)
1.以前的方法如果是要获得程序运行的当前目录所在位置,那么可以使用os模块的os.getcwd()函数.如果是要获得当前执行的脚本的所在目录位置,那么需要使用sys模块的sys.path[0]变量或者 ...
- English trip -- Review Unit1 Personal Information 个人信息
1.重点内容进行自我介绍 What's you name? I'm Loki Where are you from? I'm Local, I'm Chengdu How old are you? t ...
- English trip -- Review Unit 9 Daily living 日常生活
主要讲了一个时态:现在进行时 Be动词+Ving 需要记住的有6种规律 1.直接单词后面 + ing e.g. watch -> watching 2.是ie结尾的单词,变y ...
- 3-23Agile Web Development,3-24(chapter: 6)
第2章 Instant Gratification 复习 和 练习第一章,新建rails web页面. 重点: 知道了类,方法,实例变量 在rails是怎么用的. rails generate con ...
- android--------Android内存分析工具的使用
内存分析(in-memory analytics)是我们编写速度快.效率高的代码必不可少的知识.如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的.那么内存分析是什么? ...
- Windows 环境下安装 Oracle JDK
本页面中描述了如何在 Window 环境下安装 Oracle JDK. 我们使用的版本是 Window 10,我们需要安装的版本是 Oracle JDK 8u191. 检查当前版本 在进行新的 JDK ...
- Java进阶资料汇总
Java经过将近20年的发展壮大,框架体系已经丰满俱全:从前端到后台到数据库,从智能终端到大数据都能看到Java的身影,个人感觉做后台进要求越来越高,越来越难. 为什么现在Java程序员越来越难做,一 ...