几个月前做过了,而且也理解了最大最小表示法,不过今天看了一遍题又忘了,
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e4 + 5;
struct abc{
char str[105];
}S[N];
int getMin(char *s)
{
int n = strlen(s);
int i = 0,j = 1,k = 0,t;
while(i < n && j < n && k < n)
{
t = s[(i+k)%n] - s[(j+k)%n];
if(!t) k++;
else
{
if(t > 0) i += k+1;
else j += k+1;
if(i == j) j++;
k = 0;
}
}
return i >j ?j :i;
}
bool cmp(struct abc a, struct abc b){
if(strcmp(a.str, b.str) < 0){
return true;
}
return false;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF){
for(int i = 0; i < n; ++i){
scanf("%s", S[i].str);
int q = getMin(S[i].str), l = strlen(S[i].str);
char tmp[105];
for(int j = 0; j < l; ++j){
int t = (q + j) % l;
tmp[j] = S[i].str[t];
}
tmp[l] = '\0';
strcpy(S[i].str, tmp);
}
sort(S, S + n, cmp);
int ans = 1;
char cmp[105];
strcpy(cmp, S[0].str);
for(int i = 1; i < n; ++i){
if(strcmp(cmp, S[i].str) == 0);
else{
strcpy(cmp, S[i].str);
++ans;
}
}
printf("%d\n", ans);
}
return 0;
}