字典序问题

原创 2016年05月31日 12:40:45
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
class permu {
    private:
        int sort[99999];
        int size;
    public:
    permu() {
        memset(sort, 0, sizeof(sort));
        size = 0;
    };
    permu(int n) {
        memset(sort, 0, sizeof(sort));
        for (int i = 0; i < n; i++) {
            sort[i] = i;
        }
        size = n;
    }
    permu(const permu& other) {
        memset(sort, 0, sizeof(sort));
        for (int i = 0; i < other.size; i++) {
            sort[i] = other.sort[i];
        }
        size = other.size;
    }
    void turn (int n, int m) {
        int temp = sort[n];
        sort[n] = sort[m];
        sort[m] = temp;
    }
    void preper() {
        if (size == 2) {
            turn(0,1);
            return;
        }
        bool isfin = 1;
        int i, j;
        for (i = 0; i < size - 1; i++) {  // Judge if finished
            if (sort[i] > sort[i + 1]) {
                isfin = 0;
                break;
            }
        }
        if (!isfin) {
        for (i = size - 1; i >= 0; i--) {
            if (sort[i] < sort[i-1]) {
                i--;
                break;
            }
        }
        for (j = i; j <= size-1; j++) {
            if (sort[j] > sort[i]) {
                j--;
                break;
            }
            if (j == size-1) {
            break;
            }
        }
        turn(i, j);
        reverse(i+1, size - 1);
    } else {
        reverse(0, size-1);
    }
    };
    inline permu operator++(int n) {
        permu temp = *this;
        nextper();
        return temp;
    };
    inline permu& operator++() {
        nextper();
        return *this;
    };
        inline permu operator--(int n) {
        permu temp = *this;
        preper();
        return temp;
    };
    inline permu& operator--() {
        preper();
        return *this;
    };
    permu& operator =(permu a) {
        size = a.size;
        for (int i = 0; i < size; ++i) {
            sort[i] = a.sort[i];
        }
        return *this;
    };
    void reverse(int m, int n) {
        if (m == n) return;
        int a[100];
        int i, j;
        for (i = n, j = 0; i >= m; i--, j++) {
            a[j] = sort[i];
        }
        for (i = m, j = 0; i <= n; i++, j++) {
            sort[i] = a[j];
        }
    };
    void nextper() {  //++
        if (size == 2) {
            turn(0,1);
            return;
        }
        bool isfin = 1;
        int i, j;
        for (i = 0; i < size - 1; i++) {  // Judge if finished
            if (sort[i] < sort[i + 1]) {
                isfin = 0;
                break;
            }
        }
        if (!isfin) {
        for (j = size - 1; j > 0; j--) {
            if (sort[j] > sort[j - 1]) {
                j--;
                break;
            }
        }
        for (i = j; i < size - 1; i++) {
            if (sort[i] < sort[j]) {
                i--;
                // the position to be turned
                break;
            }
        }
        turn(i, j);
        reverse(j+1, size - 1);
    } else {
        for (int t = 0; t < size; t++) {
            sort[t] = t;
        }
                    reverse(0, size-1);
    }
    };
    friend ostream& operator<<(ostream& out, permu & a);
};
ostream& operator<<(ostream& out, permu &a) {
    for (int i = 0; i < a.size; i++) {
        out << a.sort[i] << " ";
    }
    return out;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

排列的字典序问题

POJ3617 字典序最小问题

Best Cow Line Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16228   Accepted: 4...

南邮 OJ 1202 字典序问题

字典序问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 267      ...

排列的字典序问题

问题描述:n个元素{1,2,……, n }有n!个不同的排列。将这n!个排列按字典序排列,并编号为0,1,…,n!-1。每个排列的编号为其字典序值。例如,当n=3时,6 个不同排列的字典序值如下: 给...

练习题 No.4 字典序最小问题(贪心法)

要求给定长度为N的字符串S,要构造一个长度为N的字符串T。起初,T是一个空串,随后反复进行下列任意操作。 1. 从S的头部删除一个字符,加到T的尾部。 2. 从S的尾部删除一个字符,加到T的尾部输...

POJ2488 A Knight's Journey(深搜DFS,字典序,骑士游历问题)

题目: A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4298...

字典序问题

题目:   字典序问题,给定一个长度不超过6的小写字母升序字符串(字符串中的字符相对顺序和字母表中的顺序一致),迅速计算出在字典中的编码,字典如:     1   2   3   ...     26...

字典序问题

问题描述:在数据加密和数据压缩中需要对特殊的字符串进行编码。给定的字母表由26个小写字母组成。该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出...

字典序问题

#include #include using namespace std; namespace { constexpr int pascalVal(int row, int...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)