[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年,所 ...
随机推荐
- 关于CDH5.2+ 添加hive自定义UDAF函数的方法
- Python 安装、循环语句、数据类型(一)
一.关于版本的选择 Should i use Python 2 or Python 3 for my development activity?转载自Python官网 Short version: P ...
- (Problem 74)Digit factorial chains
The number 145 is well known for the property that the sum of the factorial of its digits is equal t ...
- [转]Swift 编程语言入门教程
今天在网上看到一篇非常好的教程,分享给大家 原文地址:http://gashero.iteye.com/blog/2075324 目录 1 简介 2 Swift入门 3 简单值 4 控 ...
- QWidget QMainWindow QDialog 之间的区别
QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个原子:它从窗口系统接收鼠标.键盘和其它事件,并且在屏幕上绘制自己的表现.每一个窗口部件都是矩形,并且它们按Z轴顺序排列的.一个窗口部 ...
- QT实现拖放文件(有例子,并且图文并茂,非常清楚)
转自:http://my.oschina.net/voler/blog/345722 目录[-] 0. 源代码下载地址 1. 简单文件拖放 2. 复杂文件拖放 3. 通过按钮来完成列表数据的转移 4. ...
- javaweb学习路之二--上传gitgub
代码上传github 代码上传到github的步骤 第一步:申请github账号 https://github.com/注册账号 第二步:登录github,新建repository仓库,命名,创建 第 ...
- 学习MVC遇到的问题
修改电脑上的DNS配置: Opendns 首选DNS服务器和备用DNS服务器分别设置为208.67.222.222和208.67.220.220 google的8.8.8.8 首选DNS服务器和备用D ...
- 写一个背景渐变的TextView输入框
1:在res文件夹下新建一个drawble文件夹,并新建一个背景文件如writebg.xml <?xml version="1.0" encoding="utf-8 ...
- Intellij IDEA 常用 设置 及 快捷键 (持续更新)
Transparent native-to-ascii conversion以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开Mod ...