hdu 2609 How many

来源:互联网 发布:丽贝卡百年孤独知乎 编辑:程序博客网 时间:2024/05/13 15:17

点击打开链接hdu 2609


思路:字符串的最小表示

分析:
1 题目要求的是给定n个字符串,找出不同的字符串的个数。由于题目说了,字符串可以进行变换,也就是如果两个字符串相同那么它们的最小表示是相同的。
2 只要求出所有字符串的最小表示,然后利用set存储,最后set的元素个数就是最后的ans

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<set>using namespace std;#define MAXN 210int 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;}


原创粉丝点击