题目链接:HDU - 2609
大致题意:
这题就是给你n个字符串,然后如果是同构的字符串(如 :1100和0110和0011就是同样的字符串)
所以这题的话,就是用最小表示法求出所有字符串的最小表示法,再暴力一下,求出不同的最小表示法的个数。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N =1e4+9;
string vec[MAX_N];
int res[MAX_N];
string cmp[MAX_N];
vector<string> que;
int getMin(string str)
{
int len = str.length();
int i=0,j=1;
int k=0;
while(i<len && j<len)
{
int t = str[(i+k)%len] - str[(j+k)%len];
if(!t) k++;
else
{
if(t < 0)
{
if(j+k+1 > i) j = j+k+1;
else j = i+1;
}
else if(i+k+1 > j) i = i+k+1;
else i = j+1;
k=0;
}
if(k>=len) break;
}
return i>j?j:i;
}
int main()
{
//freopen("in.txt","r",stdin);
int N,M,T;
while(cin>>N)
{
que.clear();
int num = 0;
for(int i =0;i<N;i++) cin>>vec[i];
for(int i =0;i<N;i++) res[i] = getMin(vec[i]);
for(int i =0;i<N;i++)
{
cmp[i] = vec[i].substr(res[i],vec[i].length()-res[i]) + vec[i].substr(0,res[i]);
}
for(int i=0;i<N;i++)
{
int flag = false;
for(int j =0 ;j<num;j++)
{
if(cmp[i] == que[j]) flag = true;
}
if(!flag)
{
num ++ ;
que.push_back(cmp[i]);
}
}
cout<<num<<endl;
}
return 0;
}