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;
}