[Swust OJ 715]--字典序问题(组合数预处理/数位dp)
题目链接:http://acm.swust.edu.cn/problem/715/
1 2 … 26 27 28 …
a b … z ab ac …
对于给定的长度不超过6 的升序字符串,编程计算出它在上述字典中的编码。
接下来的k行中,每行给出一个字符串。
|
1
2
3
|
2
a
b
|
|
1
2
|
1
2
|
#include <iostream>
#include <cstring>
using namespace std; char s[];
int cur[][] = { }; //预处理 利用杨辉三角计算组合数
void init(){
int i, left, right;
for (i = ; i <= ; i++){
cur[i][] = cur[i][i] = ;
left = , right = i - ;
while (left <= right){
cur[i][left] = cur[i - ][left - ] + cur[i - ][left];
cur[i][right--] = cur[i][left++];//组合数性质cur[i][j]=cur[i][i-j];
}
}
} //长度小于len的串的个数
int minlen_num(int len){
int i, cnt = ;
for (i = ; i < len; i++)
cnt += cur[][i];
return cnt;
} //当前长度下当前串前面的个数
int enquallen_num(int len){
int i, j, cnt = , pre = -, tmp;
for (i = ; i < len; i++){
tmp = s[i] - 'a';
for (j = pre + ; j < tmp; j++)
cnt += cur[ - j - ][len - i - ];
pre = tmp;
}
return cnt;
} bool judge(int len){
for (int i = ; i < len; i++)
if (s[i] <= s[i - ])
return false;
return true;
} int main(){
init();
int t, cnt, len;
cin >> t;
while (t--){
cnt = ;
cin >> s;
len = strlen(s);
if (!judge(len)) cout << << endl;
else{
cnt += minlen_num(len);
cnt += enquallen_num(len);
cout << cnt + << endl;
}
}
return ;
}
6/18号我又回来了,这道题是可以数位dp的,当时我设计状态的时候果断逗比了~~~直接在递归时,加个判断就限制了后面数字的选取状态就可以强势ac了
(感谢学长的指点)
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define ll long long
#define N 110 char s[N];
ll bit[N];
ll dp[N][N]; ll dfs(ll pos, ll mx, bool limit, bool fzero)
{
if (pos == -) return ;
if (!limit && !fzero && ~dp[pos][mx]) return dp[pos][mx];
ll end = limit ? bit[pos] : ;
ll ans = ;
for (ll i = fzero ? : mx; i <= end; i++)//这里就判断了后面的字母的选取是否有限制(题目上的升序)
{
ans += dfs(pos - , i + , limit && i == end, fzero && !i);
}
if (!limit && !fzero) dp[pos][mx] = ans;
return ans;
}
ll cal()
{
ll len = strlen(s + );
for (ll i = ; i <= len; i++)
{
bit[len - i] = s[i] - 'a' + ;
}
return dfs(len - , , , );
}
int main()
{
int t;
cin >> t;
while (t--)
{
memset(dp, -, sizeof(dp));
scanf("%s", s + );
int flag = ;
int len = strlen(s + );
for (int i = ; i<len; i++)
{
if (!(s[i]<s[i + ]))
{
flag = ;
break;
}
}
if (!flag) printf("0\n");
else
printf("%lld\n", cal() - );
}
return ;
}
[Swust OJ 715]--字典序问题(组合数预处理/数位dp)的更多相关文章
- [UOJ86]mx的组合数——NTT+数位DP+原根与指标+卢卡斯定理
题目链接: [UOJ86]mx的组合数 题目大意:给出四个数$p,n,l,r$,对于$\forall 0\le a\le p-1$,求$l\le x\le r,C_{x}^{n}\%p=a$的$x$的 ...
- Light OJ 1032 - Fast Bit Calculations(数位DP)
题目大意: 一个数字把他看成二进制数字,数字里又会一些相邻的1,问从0到n至间所有相邻1的总和是多少? 分解成2进制数字,然后数位DP就行了. ======================== ...
- UOJ#275. 【清华集训2016】组合数问题 数位dp
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ275.html 题解 用卢卡斯定理转化成一个 k 进制意义下的数位 dp 即可. 算答案的时候补集转化一下 ...
- [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
题目链接:http://acm.swust.edu.cn/problem/0247/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- [Swust OJ 581]--彩色的石子(状压dp)
题目链接:http://acm.swust.edu.cn/problem/0581/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- swust oj 2516 教练我想学算术 dp+组合计数
#include<stdio.h> #include<string.h> #include<iostream> #include<string> #in ...
- BZOJ 3209 花神的数论题 数位DP+数论
题目大意:令Sum(i)为i在二进制下1的个数 求∏(1<=i<=n)Sum(i) 一道非常easy的数位DP 首先我们打表打出组合数 然后利用数位DP统计出二进制下1的个数为x的数的数量 ...
- [Swust OJ 541]--排列字典序问题
题目链接:http://acm.swust.edu.cn/problem/0541/ Time limit(ms): 2000 Memory limit(kb): 65535 n个元素{1,2,... ...
- [Swust OJ 1097]--2014(数位dp)
题目链接:http://acm.swust.edu.cn/problem/1097/ Time limit(ms): 1000 Memory limit(kb): 32768 今年是2014年,所 ...
随机推荐
- python质量控制
一种编写高质量软件的方式是给代码中每个函数写测试,在开发过程中经常性的进行测试. doctest模块可以在docstring中嵌套测试代码.例如: def average(values ...
- mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库
简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠 ...
- javascript 作用域链
最近想整理一下js执行代码的一些知识,如果有出错的地方还请指正. 执行环境(Execution Context) 所有的javascript代码都是在一个执行环境中被执行的.它只是一种机制,用来完成运 ...
- 05-C语言运算符
目录: 一.进制转换 二.常量 三.sizeof 四.运算符 五.赋值运算符 六.自增减运算符 七.关系运算符 八.逻辑运算符 九.取址寻址运算符 回到顶部 一.进制转换 1 进制转换是人们利用符号来 ...
- 自己动手写List集合(C#)
平时经常使用微软的List集合,觉得理所应当,这阵子突然意识到学编程学这么久,总不能只生存在某个平台某种语言下面.我觉得要跳出这个框,而数据结构是经常用到的,所以呢,作为一个有志向的程序员应该学会它. ...
- BeanFactory 和ApplicationContext
BeanFactory和ApplicationContext对待bean后置处理器稍有不同.ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有 ...
- SharePoint 2010 用Event Receiver将文件夹自动变成approved状态 (1)
当开发一个sharepoint门户网站,或者是一个内容管理的网站的时候,站点的模板通常会选用publish portal,或者是开启了publishing feature来对内容进行版本控制和流程控制 ...
- leetCode解题报告5道题(六)
题目一: Longest Substring Without Repeating Characters Given a string, find the length of the longest s ...
- c 判断水仙花数,质数(素数)
#include<stdio.h> #include<stdbool.h> //水仙花数--各位立方和等于本身 void sXh() { int x,y,z; printf(& ...
- ThinkPHP第十天(_initialize方法,SESSION销毁,分组配置,include文件引入,JOIN用法)
1.Action类中的_initialize()函数,先于任何自定义操作函数运行,可认为是控制器的前置操作.可用于检测用户是否登录等检测. 如果多个模块(Action)需要相同_initialize( ...