How many
HDU - 2609How 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.
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').
4 0110 1100 1001 0011 4 1010 0101 1000 0001
1 2
前n个有多少个不同字符就有多少个不同串,如果前n个字符全一样说明这n个都可以表示成1个
code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int n;
char s[101],ss[101];
int getmin(){
int i = 0,j = 1, k = 0;
int len = strlen(s);
while(i < len && j < len && k < len){
int t = s[(j+k)%len]-s[(i+k)%len];
if(t == 0) k++;
else{
if(t > 0) j = j+k+1;
else i = i+k+1;
if(i == j) j++;
k = 0;
}
}
int ans = min(i,j);
return ans;
}
int main(){
int i,j,k;
while(~scanf("%d",&n)){
vector<string>sn;
for(i = 0; i < n; i++){
scanf("%s",s);
int len = strlen(s);
k = getmin();
for(j = 0; j < len; j++){
ss[j] = s[(k+j)%len];
}
string st(ss);
sn.push_back(st);
}
sort(sn.begin(),sn.end());
int ans = 1;
for(i = 1; i < n; i++){
if(sn[i] != sn[i-1])
ans++;
}
printf("%d\n",ans);
}
return 0;
}
955



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



