1.题目描述:
给你n个字符串,你对于其中某个串有个操作——把串第一个字符放到最后一位......问你能否通过这样的操作使得所有字符串相同?如果能则输出最小操作数
3.解题思路:
一看n才50,直接暴力,先检查字符是否相同,再暴力以每个字符串为模板去找其他字符串变成相应字符串需要多少操作数,更新最小值。
4.AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define maxn 100100
#define lson root << 1
#define rson root << 1 | 1
#define lent (t[root].r - t[root].l + 1)
#define lenl (t[lson].r - t[lson].l + 1)
#define lenr (t[rson].r - t[rson].l + 1)
#define N 1111
#define eps 1e-6
#define pi acos(-1.0)
#define e exp(1.0)
using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;
typedef unsigned long long ull;
int vis[51][26];
string ch[51];
string tmp;
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int n;
while (~scanf("%d", &n))
{
int len = 0;
for (int i = 0; i < n; i++)
{
cin >> ch[i];
if (i == 0)
len = ch[i].length();
}
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < len; j++)
vis[i][ch[i][j] - 'a']++;
}
bool flag = 1;
for (int i = 0; i < 26 && flag; i++)
{
for (int j = 1; j < n; j++)
if (vis[j - 1][i] != vis[j][i])
{
flag = 0;
break;
}
}
if (!flag)
{
puts("-1");
continue;
}
int ans = INF;
for (int i = 0; i < n && flag; i++)
{
int cnt = 0;
for (int j = 0; j < n; j++)
{
if (i != j)
{
int pos = 0, flag1 = 0;
while (pos < len)
{
tmp = ch[j];
string tmp1 = tmp.substr(0, pos);
tmp.erase(0, pos);
tmp.append(tmp1);
if (tmp == ch[i])
{
flag1 = 1;
break;
}
pos++;
}
if (flag1)
cnt += pos;
else
flag = 0;
}
}
if (flag)
ans = min(ans, cnt);
}
if (flag)
printf("%d\n", ans);
else
puts("-1");
}
#ifndef ONLINE_JUDGE
long _end_time = clock();
printf("time = %ld ms.", _end_time - _begin_time);
#endif
return 0;
}