poj 1850 Code

来源:互联网 发布:淘宝哪家美国代购靠谱 编辑:程序博客网 时间:2024/06/05 09:01

一个组合问题。

现求出比所给字符串str短或和它一样长的所有结果,然后把和str一样长并且比str大的减去,求比str大的字符串时,从i = 1到len - 1比较,只要当前位比str的当前位大即可。

/* * Author: stormdpzh * Time: 2012/5/10 16:53:48 * POJ: 1850 Code */#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <stack>#include <map>#include <set>#include <algorithm>#include <functional>#define sz(v) ((int)(v).size())#define rep(i, n) for(int i = 0; i < n; i++)#define repf(i, a, b) for(int i = a; i <= b; i++)#define repd(i, a, b) for(int i = a; i >= b; i--)#define out(n) printf("%d\n", n)#define wh(n) while(scanf("%d", &n) != EOF)#define whz(n) while(scanf("%d", &n) != EOF && n != 0)#define lint long longusing namespace std;char str[15];int tri[30][30];int res;void getTri(){    memset(tri, 0, sizeof(tri));    tri[0][0] = 1;    repf(i, 1, 29) rep(j, i + 1) {            if(j == 0 || j == i)                tri[i][j] = 1;            else                tri[i][j] = tri[i - 1][j - 1] + tri[i - 1][j];    }}int main(){    getTri();    while(scanf("%s", str) != EOF) {        res = 0;        int len = strlen(str);        rep(i, len) repf(j, i + 1, len - 1) {            if(str[i] > str[j]) {                printf("0\n");                return 0;            }        }                repf(i, 1, len)            res += tri[26][i];        rep(i, len)            res -= tri[26 - (str[i] - 'a' + 1)][len - i];        out(res);    }        return 0;}


原创粉丝点击