题意:英语很简单,自己取读吧。
思路:
既然n和i字符串的长度都很小,最大才50,那么就是只要能出答案就任意暴力瞎搞。
本人本着暴力瞎搞的初衷,写了又臭又长的200多行(代码框架占了50行)。反正不忘初衷就对了。
暴力:枚举每一个字符串,然后暴力去算其他字符串变成该字符串需要用多少步骤,然后在众多答案中取最小值。
需要注意的是答案是-1的情况,需要用到字符串的最小表示法,预处理进行把所有的字符串变成最小表示法的字符串,如果有不一样的,那么就输出-1。因为可以通过首位对接搞成的字符串的最小表示法是唯一的。
AC代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <vector> #define rep(i,x,n) for(int i=x;i<n;i++) #define repd(i,x,n) for(int i=x;i<=n;i++) #define pii pair<int,int> #define pll pair<long long ,long long> #define gbtb std::ios::sync_with_stdio(false) #define MS0(X) memset((X), 0, sizeof((X))) #define MSC0(X) memset((X), ' ', sizeof((X))) #define pb push_back #define mp make_pair #define fi first #define se second #define gg(x) getInt(&x) using namespace std; typedef long long ll; inline void getInt(int* p); const int maxn=1000010; /*** TEMPLATE CODE * * STARTS HERE ***/ int n; char s[550][550]; char b[550][550]; int bj[520]; int fbj[520]; void findMin(char* s) { int len =strlen(s); int i=0,j=1,k=0; while(i<len&&k<len&&j<len) { if(s[(i+k)%len]==s[(j+k)%len]) { k++; } else if(s[(i+k)%len]>s[(j+k)%len]) { i=i+k+1; k=0; } else { j=j+k+1; k=0; } if(i==j) j++; } int tt=min(i,j);// findMin里的 char str[550]; strcpy(str,s); for(i=0;i<len;i++) { s[i]=str[(tt+i)%len]; } s[len]='