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; }