题目链接
题意:
找出所给字符串中,不同的有几个(循环同构也不能相同)
思路:
求出每个字符串的最小表示,然后用map 去重即可
不会戳这里
AC:
//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<map>
#include<string.h>
using namespace std;
string s;
int Get_Min(){
int i = 0, j = 1, k = 0;
int len = s.length();
while(i < len && j < len && k < len){
int t = s[(i + k) % len] - s[(j + k) % len];
if(t == 0) ++k;
else if(t < 0){ //s[(i + k)] < s[(j + k)]
j += k + 1;
k = 0;
} else { // s[(i + k)] > s[(j + k)]
i += k + 1;
k = 0;
}
if( i == j ) ++j;
}
return i < j ? i : j;
}
int main(){
int T;
while(cin >> T) {
map<string, int> mp;
int Ans = 0;
mp.clear();
while(T--){
cin >> s;
string ss = "";
int Start = Get_Min();
for (int i = Start; i < s.length(); ++i) {
ss += s[i];
}
for(int i = 0; i < Start; ++i) {
ss += s[i];
}
if(mp[ss] == 0){
mp[ss] = 1;
Ans ++;
}
}
cout << Ans << endl;
}
return 0;
}