1. 程式人生 > >Mike and strings CodeForces - 798B (又水又坑)

Mike and strings CodeForces - 798B (又水又坑)

題目連結

題意:英語很簡單,自己取讀吧。

思路:

既然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), '\0', 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]='\0'; } int main() { gbtb; cin>>n; repd(i,1,n) { cin>>s[i]; } int len=strlen(s[1]); repd(i,0,len-1) { bj[s[1][i]]++; } repd(i,2,n) { MS0(fbj); repd(j,0,len-1) { fbj[s[i][j]]++; } repd(j,1,250) { if(fbj[j]!=bj[j]) { cout<<-1<<'\n'; return 0; } } } repd(i,1,n) { repd(j,0,len-1) { b[i][j]=s[i][j]; } b[i][len]='\0'; findMin(b[i]); } repd(i,1,n-1) { if(strcmp(b[i],b[n])!=0) { cout<<-1<<'\n'; return 0; } } int ans=0x3f3f3f3f; repd(i,1,n) { int num=0; repd(j,1,n) { if(i!=j) { int cnt=0; int deng=0; int f=0; for(int k=0;k<len;k++) { if(s[i][f]!=s[j][k]) { if(deng) { cnt+=deng; deng=0; f=0; k--; continue; } // if(k+1<len&&s[i][f]!=s[j][k+1]) cnt++; }else { f++; deng++; } } num+=cnt; } } ans=min(ans,num); } cout<<ans<<'\n'; return 0; } inline void getInt(int* p) { char ch; do { ch = getchar(); } while (ch == ' ' || ch == '\n'); 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'; } } }
View Code