Time Limit: 1 second

Memory Limit: 128 MB

【问题描述】

在一条笔直的道路上共有N个路口,每个路口处都有关于该条道路的通行的信号灯。

显然,信号灯共有绿(G)、红(R)、黄(Y)三种颜色。

交通部门指出,当绿色信号灯为奇数个,且红色信号灯为偶数个时,该条道路为“通畅的”。

现在交给你一个任务:给定从第一个路口到最后一个路口的所有信号灯的序列,计算出这个序列在“通畅的”道路的字典序中的

序号。

【输入格式】

第一行,正整数N (N <= 10^5);

第二行,一个长度为N的序列(不含空格),其中第i个字母表示第i个路口信号灯的状态。

【输出格式】

输出这个序列在“通畅的”道路的字典序中的序号

(由于答案可能比较大,所以你只要输出答案除12345的余数即可。

注意,若此道路不通畅,请输出”invalid”[不含双引号]) 。

【数据规模】

对于40%的数据,N<=15;

对于70%的数据,N<=10^4;

对于100%的数据,N<=10^5。

Sample Input1

4

RGYR

Sample Output1

9

这20种通畅道路分别是(按字典序,此部分无须输出)

GGGY、GGYG、GRRY、GRYR、GYGG、

GYRR、GYYY、RGRY、RGYR、RRGY、

RRYG、RYGR、RYRG、YGGG、YGRR、

YGYY、YRGR、YRRG、YYGY、YYYG

【样例说明】

这20种通畅道路分别是(按字典序,此部分无须输出)

GGGY、GGYG、GRRY、GRYR、GYGG、

GYRR、GYYY、RGRY、RGYR、RRGY、

RRYG、RYGR、RYRG、YGGG、YGRR、

YGYY、YRGR、YRRG、YYGY、YYYG

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u248

【题解】



用f[i][2][2]表示交通序列的长度为i,第2维表示绿灯的奇偶性,第三维表示红灯的奇偶性的方案数;(0为偶数、1为奇数);

//黄灯在状态中没必要体现出来;

则有状态转移方程

    f[1][0][0] = 1;// e e yellow
f[1][0][1] = 1;// e red e
f[1][1][0] = 1;// green e e
f[1][1][1] = 0;//no exist
f[i][0][0] = f[i-1][1][0]+f[i-1][0][1]+f[i-1][0][0]
f[i][0][1] = f[i-1][1][1]+f[i-1][0][0]+f[i-1][0][1]
f[i][1][0] = f[i-1][0][0]+f[i-1][1][1]+f[i-1][1][0]
f[i][1][1] = f[i-1][0][1]+f[i-1][1][0]+f[i-1][1][1]

其中从左到右分别表示在i-1表示的序列的末尾加上一盏绿、红、黄灯;由此来转移状态;注意取模就好;

这个i数组有什么用呢->分析法搞出比输入的序列的字典序小的序列有多少个;

按照字典序G->R->Y来搞;

比如输入样例RGYR

就先搞出GXXX有多少个->ans1->根据奇偶性来用f[3][x][x];ans1就等于f[3][t][t];

然后确定第一位为R;第二位为G;因为字典序是最小的所以不用理它递增G灯个数;

…以此类推就能求出比当前序列的字典序小的序列的个数了;

最后加1就是答案;

不要忘记判断一开始的序列是不合法的情况.



【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second typedef pair<int,int> pii;
typedef pair<LL,LL> pll; void rel(LL &r)
{
r = 0;
char t = getchar();
while (!isdigit(t) && t!='-') t = getchar();
LL sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} void rei(int &r)
{
r = 0;
char t = getchar();
while (!isdigit(t)&&t!='-') t = getchar();
int sign = 1;
if (t == '-')sign = -1;
while (!isdigit(t)) t = getchar();
while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
r = r*sign;
} const int MAXN = 1e5+10;
const int dx[5] = {0,1,-1,0,0};
const int dy[5] = {0,0,0,-1,1};
const double pi = acos(-1.0);
const int MOD = 12345; int n,hong=0,lv = 0,ans = 1;
int f[MAXN][2][2];//0表示偶数1表示奇数 第一格为绿,第二格为红
char s[MAXN];
//目标是绿奇红偶 int pd(int x)
{
if (x&1) return 1; else return 0;
} void solve_green(int now)
{
lv++;
int len = n-now;
//lv==0 red ==0
if (!pd(lv)&&!pd(hong))
ans = (ans + f[len][1][0])%MOD;
//lv==1 red ==1
if (pd(lv) && pd(hong))
ans = (ans + f[len][0][1])%MOD;
//lv= 0,red = 1;
if (!pd(lv) && pd(hong))
ans = (ans + f[len][1][1]) % MOD;
//lv =1 ,red = 0;
if (pd(lv) && !pd(hong))
ans = (ans + f[len][0][0]) % MOD;
lv--;
} void solve_red(int now)
{
hong++;
int len = n-now;
//lv==0 red ==0
if (!pd(lv)&&!pd(hong))
ans = (ans + f[len][1][0])%MOD;
//lv==1 red ==1
if (pd(lv) && pd(hong))
ans = (ans + f[len][0][1])%MOD;
//lv= 0,red = 1;
if (!pd(lv) && pd(hong))
ans = (ans + f[len][1][1]) % MOD;
//lv =1 ,red = 0;
if (pd(lv) && !pd(hong))
ans = (ans + f[len][0][0]) % MOD;
hong--;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
f[1][0][0] = 1;// e e yellow
f[1][0][1] = 1;// e red e
f[1][1][0] = 1;// green e e
f[1][1][1] = 0;//no exist
rep1(i,2,1e5)
{
//green red yellow
f[i][0][0] = (f[i-1][1][0]+f[i-1][0][1]+f[i-1][0][0])%MOD;
f[i][0][1] = (f[i-1][1][1]+f[i-1][0][0]+f[i-1][0][1])%MOD;
f[i][1][0] = (f[i-1][0][0]+f[i-1][1][1]+f[i-1][1][0])%MOD;
f[i][1][1] = (f[i-1][0][1]+f[i-1][1][0]+f[i-1][1][1])%MOD;
}
cin >>n;
cin >> s+1;
//G R Y
rep1(i,1,n)
switch(s[i])
{
case 'G':
lv++;
break;
case 'R':
{
solve_green(i);
hong++;
break;
}
case 'Y':
{
solve_green(i);
solve_red(i);
break;
}
}
if ((pd(lv)==0)||(pd(hong)==1))
cout <<"invalid";
else
cout << ans << endl;
return 0;
}

【u248】交通序列号的更多相关文章

  1. 解决VS2008在win7找不到输入序列号的地方

    1.VS2008在Windows7 打开维护界面看不到可以输序列号的地方. 因为微软把他隐藏了. 2.我们可以借用工具把他显示出来 下载地址:http://www.zlsoft.com/techbbs ...

  2. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  3. TCP初始化序列号ISN

    TCP初始化序列号ISN TCP初始化序列号不能设置为一个固定值,因为这样容易被攻击者猜出后续序列号,从而遭到攻击. RFC1948中提出了一个较好的初始化序列号ISN随机生成算法. ISN = M ...

  4. ORACLE实现自定义序列号生成

    实际工作中,难免会遇到序列号生成问题,下面就是一个简单的序列号生成函数 (1)创建自定义序列号配置表如下: --自定义序列 create table S_AUTOCODE ( pk1 ) primar ...

  5. [连载]《C#通讯(串口和网络)框架的设计与实现》- 14.序列号的设计,不重复的实现一机一码

    目       录 第十四章     序列号的设计... 2 14.1        设计原则... 2 14.2        设计思想... 3 14.3        代码实现... 4 14. ...

  6. Android 手机卫士--绑定sim卡序列号

    现在开始具体 处理每一个导航页面的逻辑,首先看第二个导航页 本文地址:http://www.cnblogs.com/wuyudong/p/5949775.html,转载请注明出处. 这里需要实现绑定s ...

  7. C#/VB.NET 获取电脑属性(硬盘ID、硬盘容量、Cpu序列号、MAC地址、系统类型)

    在开发过程中,经常需要获取电脑的一些属性,如获取硬盘ID/CPU序列号/MAC地址作为来加密字符串. 1.硬盘 在我查看网上一些文档时,发现很多人对硬盘序列号很模糊~ 什么叫硬盘序列号?指的是作为一个 ...

  8. 解决SmartGit序列号问题

    SmartGit过了30天试用期之后,就需要用户输入序列号才能继续使用,有一个办法可以跳过输入序列号. 一.windows+R  输入:%APPDATA%\syntevo\SmartGit 二.打开7 ...

  9. ORACLE序列号

    select MAXSYSACCEPT.nextval from dual; (序列号检索 增1)alter sequence MAXSYSACCEPT increment by 1 cache 20 ...

随机推荐

  1. LuoguP1251 餐巾计划问题(费用流)

    题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri​块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送 ...

  2. POJ——T 2891 Strange Way to Express Integers

    http://poj.org/problem?id=2891 Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 16849   ...

  3. [REASONML] Using Javascript npm package from REASON

    For example, we want to use moment.js inside our ReasonML code. What we can do is create a module fi ...

  4. 【吴节操点评】中国企业SaaS应用深谙未来者寥寥数几 两极分化将加剧

    数年前,在国外企业级应用如火如荼的时候.国内却是一片空白.而现在企业SaaS应用市场,包含用友.金蝶.东软在内的三巨头.已经有数十家之多.相比美国3000亿美元的企业应用三巨头来说,中国企业应用前三甲 ...

  5. 混合式框架-AngularJS

    简单介绍   AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门非常好的为静态文本展示设计的声明式语言,但要构建WEB应用的话它就显得乏力了.所以我做了一些工作(你也能够认 ...

  6. shell date 命令说明

    shell date 命令说明 使用方法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式 ...

  7. SDUT--Pots(二维BFS)

    Pots Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 You are given two pots, having the ...

  8. POJ 题目1145/UVA题目112 Tree Summing(二叉树遍历)

    Tree Summing Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8132   Accepted: 1949 Desc ...

  9. Android开发经验之获取画在画布上的字符串长度、宽度(所占像素宽度)

    Android中获取字符串长度.宽度(所占像素宽度) 计算出当前绘制出来的字符串有多宽,可以这么来! 方法1: Paint paint = new Paint(); Rect rect = new R ...

  10. php中类文件名的命名的规则是什么

    php中类文件名的命名的规则是什么 一.总结 一句话总结:类库文件(工具类)类文件都是以.class.php为后缀. 1.类的方法和属性的命名规则是怎样的? 都是小驼峰法 方法的命名使用驼峰法,并且首 ...