思路:字符串的最小表示
分析:
1 题目要求的是给定n个字符串,找出不同的字符串的个数。由于题目说了,字符串可以进行变换,也就是如果两个字符串相同那么它们的最小表示是相同的。
2 只要求出所有字符串的最小表示,然后利用set存储,最后set的元素个数就是最后的ans
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; #define MAXN 210 int n , len; char String[MAXN]; set<string>s; /*求最小表示的下标*/ int getMin(){ int i = 0 , j = 1 , k = 0; while(i+k < len && j+k < len){ if(String[i+k] == String[j+k]) k++; else{ if(String[i+k] > String[j+k]) i = i+k+1; else j = j+k+1; k = 0; if(i == j) j++; } } return min(i , j); } /*求出最小表示*/ void getMinString(char *str){ str[len/2] = '\0'; s.insert(str); } int main(){ while(scanf("%d" , &n) != EOF){ s.clear(); for(int i = 0 ; i < n ; i++){ scanf("%s" , String); char tmp[MAXN]; memcpy(tmp , String , sizeof(String)); strcat(String , tmp); len = strlen(String);/*求出长度*/ int num = getMin(); getMinString(String+num); } printf("%d\n" , s.size()); } return 0; }