题目链接:http://codeforces.com/contest/798/problem/B
题意:给你n个字符串,有一种操作叫做左移,左移一次就把第一个字符加到这个字符串的末尾,问你最少的操作数使得,这个n个字符串都相等,若不存在这种操作就输出-1
解析:由于n和字符串的长度都不大,那么直接暴力搞就好,枚举最终的字符串的答案,然后逐个匹配,然后更新ans记录最小值即可
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
string slove(string s,int k,int len)
{
return s.substr(k,len-k)+s.substr(0,k);
}
int main(void)
{
int n;
scanf("%d",&n);
string a[55];
for(int i=0;i<n;i++)
cin>>a[i];
int flag = 1,ans = inf;
string t1 = a[0];
int len = t1.length();
for(int k=0;k<len;k++)
{
string tmp = slove(t1,k,len);
//cout<<k<<" "<<tmp<<endl;
int sum = 0;
for(int i=0;i<n;i++)
{
int j=0;
string tt;
for(;j<len;j++)
{
tt = slove(a[i],j,len);
if(tt==tmp)
{
sum += j;
break;
}
}
if(j==len)
{
flag = 0;
break;
}
}
if(!flag)
break;
ans = min(ans,sum);
}
if(!flag)
puts("-1");
else
printf("%d\n",ans);
return 0;
}