给定n个字符串,一次操作将某一字符串的首字符移到末尾,问经过操作后都相等的最少移动次数。
每个字符串最大范围是移动n次,所以mp数组初始化为输入值的两倍,再利用find函数查找匹配的位置,下标相加求最小。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=55;
const int inf=1e9;
int main(){
int n;
string s[N],mp[N];
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>s[i];
mp[i]=s[i]+s[i];
}
int flag=0,sum=0,ans=inf;
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<n;j++){
if(mp[j].find(s[i])==string::npos){
flag=1; //字符串不同
break;
}
else
sum+=mp[j].find(s[i]);
}
if(flag) break;
ans=min(ans,sum);
}
if(flag)
printf("-1\n");
else
printf("%d\n",ans);
return 0;
}