标签:
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 8414 | Accepted: 3983 |
Description
Input
Output
Sample Input
bf
Sample Output
55
Source
给出一个字符串的字典中的编号,编号是升序的,否则输出0
dp[i][j] i记录这是字符串中的第i位字符,j代表以a到z开头 时的总数
num[i] 代表在第i位之前出现的个数。
按字符串从高位开始向后累加,注意最后加上字符串自身。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std ; #define LL __int64 LL dp[30][30] , num[30] ; char str[30] ; void init() { int i , j , k ; memset(dp,0,sizeof(dp)) ; memset(num,0,sizeof(num)) ; for(j = 0 ; j < 26 ; j++) dp[1][j] = 1 ; for(i = 2 ; i <= 26 ; i++) { for(j = 0 ; j < 26 ; j++) { for(k = j+1 ; k < 26 ; k++) dp[i][j] += dp[i-1][k] ; } num[i] = num[i-1] ; for(j = 0 ; j < 26 ; j++) num[i] += dp[i-1][j] ; } return ; } int main() { int i , j , l , k , last ; LL ans = 0 ; init() ; while( scanf("%s", str) != EOF ) { l = strlen(str) ; for(i = 1 ; i < l ; i++) if( str[i-1] >= str[i] ) break ; if( i < l ) { printf("0\n") ; continue ; } ans = num[l] ; last = -1 ; for(i = l ; i >= 1 ; i--) { k = str[l-i] - 'a' ; for(j = last+1 ; j < k ; j++) ans += dp[i][j] ; last = k ; } ans++ ; printf("%I64d\n", ans) ; } return 0; }
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43017047