B. Mike and strings
题意:
有n个相同长度的字符串,现在问是否可以通过一种操作使得恢复成一样的字符串,若能,输出最少的次数。
操作:把当前字符串的第一个字母放到最后一个字母的后边。
n < 50.
length < 50.
思路:
看到数据的范围就感觉可以暴力求,但是对于字符串的题,不要急于动手打代码。
想清楚思路:
成为相同的字符串不确定,枚举相同字符串的第一个字母位置,那么就确定。然后依次求出每一种方式的最少步数即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 55;
char s[maxn][maxn];
int length,n;
int ok(int a,int b,int c)
{
int flag = true;
int t = length;
while(t--) {
if(s[1][a] != s[b][c]) {
flag = false;
break;
}
a++,c++;
if(a > length) a = 1;
if(c > length) c = 1;
}
return flag;
}
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d",&n);
for(int i = 1;i <= n; i++) {
scanf("%s",s[i]+1);
}
length = strlen(s[1]+1);
int ans = 0x3f3f3f3f;
int flag = false;
for(int i = 1;i <= length; i++) {
int temp = 0;
for(int j = 2;j <= n; j++) {
for(int k = 1;k <= length; k++) {
if(s[1][i] == s[j][k]) {
if(ok(i,j,k)) {
temp += k-1;
break;
}
}
if(k == length) flag = true;
}
if(flag == true) break;
}
if(flag == true) break;
temp += i - 1;
ans = min(ans,temp);
}
if(flag) {
printf("-1\n");
return 0;
}
printf("%d\n",ans);
return 0;
}