How many
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1313 Accepted Submission(s): 514
Problem Description
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 are some).
For example 0110 express a necklace, you can rotate it. 0110 -> 1100 -> 1001 -> 0011->0110.
How many kinds of necklaces total have.(if two necklaces can equal by rotating ,we say the two necklaces are some).
For example 0110 express a necklace, you can rotate it. 0110 -> 1100 -> 1001 -> 0011->0110.
Input
The input contains multiple test cases.
Each test case include: first one integers n. (2<=n<=10000)
Next n lines follow. Each line has a equal length character string. (string only include '0','1').
Each test case include: first one integers n. (2<=n<=10000)
Next n lines follow. Each line has a equal length character string. (string only include '0','1').
Output
For each test case output a integer , how many different necklaces.
Sample Input
4 0110 1100 1001 0011 4 1010 0101 1000 0001
Sample Output
1 2题意:给出n个字符串,若一个字符串左移或右移得到另一个字符串,则认为这两个字符串是一样的,问有多少个不一样的字符串。思路:字符串的最小表示法,将所有字符串化成最小表示的形式,排序,计数。AC代码:#include <iostream> #include <cmath> #include <cstdlib> #include <cstring> #include <cstdio> #include <queue> #include <ctime> #include <algorithm> #define ll long long using namespace std; const int INF = 1e9; const int maxn = 10005; struct node{ char s[1005]; }str[maxn]; int n; int Minrp(char *s, int len){ int i = 0, j = 1, k = 0; 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) i = i + k + 1; else j = j + k + 1; if(i == j) j++; k = 0; } } return min(i, j); } bool cmp(node a, node b){ return strcmp(a.s, b.s) < 0; } int main() { char a[1005]; while(~scanf("%d", &n)) { for(int i = 0; i < n; i++) { scanf("%s", a); int len = strlen(a), cnt = 0; int k = Minrp(a, len); for(int j = k; j < len; j++) str[i].s[cnt++] = a[j]; for(int j = 0; j < k; j++) str[i].s[cnt++] = a[j]; str[i].s[cnt] = '\0'; } sort(str, str + n, cmp); int ans = 1; for(int i = 1; i < n; i++) if(strcmp(str[i].s, str[i - 1].s) != 0) ans++; printf("%d\n", ans); } return 0; }
本文介绍了一种解决旋转项链问题的方法,通过将字符串转化为其最小表示形式并进行排序,最终统计不同类型的项链数量。该方法适用于字符串匹配及相似性判断等场景。

被折叠的 条评论
为什么被折叠?



