题目链接:
http://codeforces.com/problemset/problem/798/B
题解:
自己当初没怎么考虑清楚,没有考虑到循环节这个情况。直接先处理了会出现交换的所有的情况,然后直接去对所有的字符串进行比对。
代码:
#include <cstdio>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 50+10;
string s1[maxn],s2[maxn];
string ans[1000+10];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>s1[i];
for(int i=0;i<n;i++)
s2[i]=s1[i];
for(int i=0;i<n;i++)
sort(s2[i].begin(),s2[i].end());
int flag=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(s2[i]!=s2[j])
{
flag=1;
break;
}
}
int len=0;
met(ans,'\0');
for(int i=0;i<s1[0].size();i++)
{
for(int j=i;j<s1[0].size();j++)
{
ans[len]+=s1[0][j];
}
for(int j=0;j<i;j++)
{
ans[len]+=s1[0][j];
}
len++;
}
int flag1=0;
for(int i=1;i<n;i++)
{
flag1=0;
for(int j=0;j<len;j++)
{
if(s1[i]==ans[j])
{
flag1=1;
break;
}
}
if(!flag1)
{
flag=1;
break;
}
}
int MIN=inf;
int cnt=0;
for(int i=0;i<len;i++)
{
cnt=0;
for(int j=1;j<n;j++)
{
int xxx=inf;
for(int k=0;k<len;k++)
{
if(s1[j]==ans[k])
{
int xx=k-i;
if(xx<0)
xx=(-1)*xx;
else if(xx>0)
xx=s1[0].size()-xx;
xxx=min(xx,xxx);
}
}
cnt+=xxx;
}
cnt+=i;
// cout<<cnt<<endl;
MIN=min(cnt,MIN);
}
if(flag)
cout<<"-1"<<endl;
else
cout<<MIN<<endl;
}