时间复杂度 O(n*n*|s| )
纯暴力,通过string.substr()函数来构造每一个字符串平移后的字符串。
#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; const int inf=0x3f3f3f3f; /*** TEMPLATE CODE * * STARTS HERE ***/ int n; string getst(string x,int k,int len) { return x.substr(k,len-k)+x.substr(0,k); } int main() { gg(n); string a[55]; repd(i,1,n) { cin>>a[i]; } int ans=inf; string x=a[1]; int len=x.length(); int flag=0; repd(i,1,n) { int cnt=0; string temp=a[i]; repd(j,1,n) { int k; for( k=0;k<len;k++) { string xin=getst(a[j],k,len); if(xin==temp) { cnt+=k; break; } } if(k==len) { flag=1; break; } } if(flag) { break; } ans=min(ans,cnt); } if(flag) { printf("-1 "); }else { printf("%d ",ans ); } return 0; } inline void getInt(int* p) { char ch; do { ch = getchar(); } while (ch == ' ' || ch == ' '); if (ch == '-') { *p = -(getchar() - '0'); while ((ch = getchar()) >= '0' && ch <= '9') { *p = *p * 10 - ch + '0'; } } else { *p = ch - '0'; while ((ch = getchar()) >= '0' && ch <= '9') { *p = *p * 10 + ch - '0'; } } }