HDU2609
本题为给你n个01串,可以对每个串旋转任意次,求最少出现多少个不同的字符串,我们可以知道,如果两个字符串是可以旋转之后相同的,那么他们的最小表示法一定是相同的,所以我们可以求出所有字符串的最小表示法,然后用一个set去重就好了。
HDU2609代码
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<set>
using namespace std;
int getmin(char *s)
{
int n=strlen(s);
int i=0,j=1,k=0,t;
while(i<n && j<n && k<n)
{
t=s[(i+k)%n]-s[(j+k)%n];
if (!t) k++;
else
{
if (t>0) i+=k+1;
else j+=k+1;
if (i==j) j++;
k=0;
}
}
return i<j?i:j;
}
char str[105];
string tmp;
set<string> s;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
s.clear();
for(int i=0;i<n;i++)
{
scanf("%s",str);
tmp=str;
int pos=getmin(str);
string pp=tmp.substr(pos)+tmp.substr(0,pos);
s.insert(pp);
}
printf("%d\n",(int)s.size());
}
return 0;
}