题意:
给你n串项链(字符串可以左移),判断有多少种不同的项链
思路:
最小表示法+set
如果这些长度相同的字符串通过旋转后相同,则他们的最小表示法一定相同,最后set的大小即为不同的串数。
substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字符串的长度,则子字符串将延续到源字符串的结尾。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
string a[maxn],b[maxn];
set<string>s;
int getmin(string p)
{
int len = p.size();
int i = 0,j = 1,k = 0;
while(i<len && j<len && k<len)
{
int t = p[(i+k)%len]-p[(j+k)%len];
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;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i] = a[i]+a[i];
}
for(int i=0;i<n;i++)
{
int k = getmin(a[i]);
s.insert(b[i].substr(k,a[i].size()));
}
cout<<s.size()<<endl;
s.clear();
}
return 0;
}