HDU-2609-How many(最小表示法)

思路:

将输入的字符串转换成字典序最小的表示形式,存入set去重。用字典序最大的形式表示也是一样的;

  • 最小表示法
    Accepted 2609 62MS 3296K 804 B G++
    #include "bits/stdc++.h"
    using namespace std;
    char s[205];
    int n, m, k;
    set<string> st;
    // 求最小表示法 
    int getMin(char* s) {
        int i = 0, j = 1, k = 0;
        while (i < m && j < m && k < m) {
            int t = s[(i + k) % m] - s[(j + k) % m];
            if (t == 0) {
                k++;
            } else {
                if (t > 0) {
                    i += k + 1;
                } else {
                    j += k + 1;
                }
                if (i == j) {
                    j++;
                } 
                k = 0;
            }
        }
        return min(i, j);
    }
    int main() {
        while (~scanf("%d", &n)) {
            while (n--) {
                scanf("%s", s);
                m = strlen(s);
                k = getMin(s);
                // 把s[k]前面的字符全部移到字符串末尾 
                for (int i = 0; i < k; i++) {
                    s[m + i] = s[i];
                }
                s[m + k] = '\0';
                // 字符串s + k就是原字符串的最小表示法 
                st.insert(s + k);
            }
            printf("%d\n", st.size());
            st.clear();
        }
        return 0;
    }

     

posted @ 2019-02-13 12:17  Jathon-cnblogs  阅读(171)  评论(0编辑  收藏  举报