https://vjudge.net/problem/POJ-1850

题意

输出某字符串在字典中的位置。字符串不合规则时输出0。

分析

首先判断字符串合法性,也就是判断是不是升序排列的。如果符合,以“vwxyz”为例,先计算长度小于5的串。

长度为1:C(26,1)

长度为2:由于规定了是升序序列,那么只要字母确定了,排列的情况也就确定了,于是此时可以认为方案数就等于从26个字母里任选两个出来,即C(26,2),经验证也是正确的。

长度为3:同上,C(26,3),长度为4:C(26,4)。

接下来是计算相同长度的,这里逐位来计算比较方便,例如从第0位开始(’v‘),计算aXXXX,bXXXX……uXXXX。然后第1位(‘w'),计算aXXX,bXXX……vXXX。以此类推,详细看代码就懂了。最后答案就是以上得到的总和+1。

预处理组合数用递推的方法。

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set> #define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0) using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int N = 1e6+;
//const int MAXN = 210;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = ;
int T;
void testcase(){
printf("Case #%d: ",++T);
}
const int MAXN = 3e5+;
const int MAXM = ;
int c[][];
void init(){
mset(c,);
for(int i=;i<;i++){
c[i][]=;
for(int j=;j<=i;j++){
c[i][j]=c[i-][j-]+c[i-][j];
}
}
}
char a[];
int main() {
#ifdef LOCAL
freopen("data.in","r",stdin);
#endif // LOCAL
init();
scanf("%s",a);
int len = strlen(a);
for(int i=;i<len;i++){
if(a[i-]>=a[i]){
puts("");
return ;
}
}
ll ans=;
for(int i=;i<len;i++) ans+=c[][i];
for(int i=;i<len;i++){
char ch = (!i)?'a':a[i-]+;
while(ch<=a[i]-){
ans+=c['z'-ch][len-i-];
ch++;
}
}
cout<<ans+;
return ;
}

最新文章

  1. 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
  2. 移动前端开发之viewport的深入理解
  3. zabbix监控单核cpu使用率和多核cpu总负载
  4. Android studio 提示:Can&#39;t use Subversion command line client: svn Probably the path to Subversion executable is wrong. Fix it.
  5. ajax通讯之格式详解
  6. 十二 .ocBlock
  7. maven学习(5)-maven中常见错误
  8. Intellij 图标介绍及配置文件常识
  9. 02 Linux 下安装JDK并测试开发“Hello World!”
  10. PIC18F中断定时器
  11. LEFT JOIN、Right、Full后ON和WHERE的区别
  12. Linux下用freetds连接mssql中文乱码的问题【参考2】
  13. linux find命令详解--转
  14. 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)
  15. (读书笔记).NET大局观-.NET语言(1)
  16. 解决Android Studio Gradle Build特别慢的问题
  17. CodeForces 543D:Road Improvement
  18. bzoj 2783: [JLOI2012]树
  19. RSA算法的C++string实现(模幂算法和欧几里得算法的使用)后附思路
  20. [05] 动态SQL

热门文章

  1. Centos7 yum安装Chrome浏览器
  2. Eclipse 下载安装
  3. python模块_多重继承的MRO
  4. Linux基础学习(7)--用户和用户组管理
  5. 睡前小dp-poj2096-概率dp
  6. 睡前小dp-codeforce414B-dp+一点点想法
  7. 最大获利 HYSBZ - 1497 (最大权闭合图)
  8. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence
  9. Maven项目读取resources下文件的路径问题(getClassLoader的作用)
  10. day7 笔记