题目链接:https://cn.vjudge.net/problem/HDU-2609
题解:最小表示法求出起始位置,用set记录下新串即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int get_max_min(char *s, int flag) { // 1 最大 0 最小
int len = strlen(s);
int i = 0, j = 1, k = 0, t;
while(i < len && j < len && k < len) {
t = s[(i + k) % len] - s[(j + k) % len];
if(!t) k++;
else {
if(flag) {
if(t > 0) j += k + 1;
else i += k + 1;
} else {
if(t > 0) i += k + 1;
else j += k + 1;
}
if(i == j) j++;
k = 0;
}
}
return min(i, j) ;
}
int main() {
int n, pos, len;
char str[N];
string tmp;
set<string> s;
while(~scanf("%d", &n)) {
s.clear();
for(int i = 0; i < n; i++) {
scanf("%s", str);
len = strlen(str);
pos = get_max_min(str, 0);
tmp = "";
for(int j = pos; j < len; j++)
tmp += str[j];
for(int j = 0; j < pos; j++)
tmp += str[j];
// cout << tmp << endl;
s.insert(tmp);
}
printf("%d\n", s.size());
}
return 0;
}