Description
题目链接
将由小写字母组成的字符串按照以下条件排序:
我们将这些字符串标上序号,问一字符串对应的序号是多少?
$1\leq len \leq 10$
Solution
很明显,这题也可以分两类组合起来。
- 字符串长度为 $[1,len-1]$,这时可以通过组合数公式易知其数量。
- 字符串长度为 $len$,这是只要保证字符串是严格递增,并且不能超过输入的字符串即可。
$$Ans=\sum_{i=1}^{i<len}C_{26}^i+\sum_{i=1}^{i<=n}\sum_{j=s[i-1]+1}^{j<s[i]} C_{‘z’-j}^{n-i}$$
注意处理下边界即可。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #include<algorithm> #include<cstdio> #include<cmath> #include<vector> #include<cstring> #include<iostream> #include<queue> #define W while #define I inline #define gc getchar #define D isdigit(c=gc()) #define Cn const #define pc(c) putchar((c)) #define LL long long using namespace std; I int read(){int x=0,f=1;char c;W(!D) f=c^'-'?1:-1;W(x=(x<<3)+(x<<1)+(c&15),D);return x*f;} I void write(int x){x<0&&(pc('-'),x=-x),x<10?(pc(x+'0'),0):(write(x/10),pc(x%10+'0'),0);} const int N=55; int n,C[N][N],Ans; char s[N]; I void init(){ for(int i=0;i<=53;i++) C[i][0]=C[i][i]=1; for(int i=1;i<=53;i++) for(int j=1;j<i;j++) C[i][j]=C[i-1][j]+C[i-1][j-1]; } int main(){ init();cin>>s+1;n=strlen(s+1); for(int i=1;i<n;i++) if(s[i]>s[i+1]) return puts("0"),0; for(int i=1;i<n;i++) Ans+=C[26][i]; for(int i=1;i<=n;i++) for(int j=i==1?'a':s[i-1]+1;j<s[i];j++) Ans+=C['z'-j][n-i]; return write(Ans+1),pc('\n'),0; }
|