HDU-2609-How many(最小表示法)
发布时间:2020-12-16 09:11:46 所属栏目:百科 来源:网络整理
导读:链接: https://vjudge.net/problem/HDU-2609 题意: Give you n ( n 10000) necklaces,the length of necklace will not large than 100,tell me How many kinds of necklaces total have.(if two necklaces can equal by rotating,we say the two necklaces
链接:https://vjudge.net/problem/HDU-2609 题意:Give you n ( n < 10000) necklaces,the length of necklace will not large than 100,tell me 思路:找到每个字符串的最小表示法.加到set里去重即可. 代码:#include <iostream> #include <cstdio> #include <cstring> #include <vector> //#include <memory.h> #include <queue> #include <set> #include <map> #include <algorithm> #include <math.h> #include <stack> #include <string> #include <assert.h> #include <iomanip> #include <iostream> #include <sstream> #define MINF 0x3f3f3f3f using namespace std; typedef long long LL; const int MAXN = 1e4+10; const int MOD = 1e4+7; char a[MAXN][110]; set<string> St; int n; int GetStrMin(char *s) { int i = 0,j = 1,k = 0; int len = strlen(s); while (i < len && j < len && k < len) { int cmp = s[(i+k)%len]-s[(j+k)%len]; if (cmp == 0) k++; else { if (cmp > 0) i += k+1; else j += k+1; if (i == j) j++; k = 0; } } return min(i,j); } void Insert(char *s,int p) { int len = strlen(s); char tmp[210] = ""; strcat(tmp,s); strcat(tmp,s); tmp[p+len-1] = 0; St.insert(tmp+p); } int main() { while (~scanf("%d",&n)) { St.clear(); for (int i = 1;i <= n;i++) scanf("%s",a[i]); for (int i = 1;i <= n;i++) { int p = GetStrMin(a[i]); Insert(a[i],p); } printf("%dn",(int)St.size()); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |