日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

AtCoder AGC037E Reversing and Concatenating

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AtCoder AGC037E Reversing and Concatenating 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

https://atcoder.jp/contests/agc037/tasks/agc037_e

題解

天哪,這場題目難度大概真的是亂序吧。。。。A<C<E<D<B<F? 后悔考場上沒看看這題= =
首先在一般情況下,不妨設串中出現過的最小字符為\(a\), 最長連續的\(a\)的長度是\(l\), 那么顯然答案的前至少\(2^{k-1}\times l\)位都是\(a\).
然后發現,假設確定了第一步的操作,那么后面的操作都是唯一確定的,且可以在\(O(n)\)時間內得到。
于是枚舉一下第一步操作
然后。。就做完了啊。。。
時間復雜度\(O(N^2)\).

但是有個比較惡心的細節:如果這個字符串末尾有若干個字符\(a\)要特殊處理(具體見代碼)。并且即便末尾\(a\)的長度不足\(l\)也有可能成為最優解(因為相當于省去了一次操作,應該是達到\(\frac{l}{2}\)就有可能)。
例如以下數據:

8 1 baaacbaa

因此WA了4發。

代碼

#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #include<algorithm> #include<cassert> using namespace std;void read(int &x) {int f=1;x=0;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f; }const int N = 5000; char a[N+3]; char ans[N+3][N+3]; char mnc; int n,m,num;bool cmp(int x,int y) {for(int i=1; i<=n; i++){if(ans[x][i]<ans[y][i]) return true;if(ans[x][i]>ans[y][i]) return false;}return false; }int main() {scanf("%d%d",&n,&m);scanf("%s",a+1);mnc = 'z'; for(int i=1; i<=n; i++) mnc = min(mnc,a[i]);if(m>=14) {for(int i=1; i<=n; i++) printf("%c",mnc); return 0;}int len = 0,mxl = 0;for(int i=1; i<=n; i++){if(a[i]!=mnc) len = 0;else len++;if(len>mxl) {mxl = len;}}len = 0; num = 0;for(int i=1; i<=n; i++){if(a[i]!=mnc) len = 0;else len++;if(i==n){num++;int tmp = min(n,len*(1<<m));for(int j=1; j<=tmp; j++) ans[num][j] = mnc;for(int j=tmp+1,k=n-len; j<=n; j++,k--) ans[num][j] = a[k];}if(len==mxl){num++;int tmp = min(n,len*(1<<m-1));for(int j=1; j<=tmp; j++) ans[num][j] = mnc;for(int j=tmp+1,k=i+1; j<=n; j++,k++){ans[num][j] = a[k<=n?k:2*n+1-k];}}} // for(int i=1; i<=num; i++) {for(int j=1; j<=n; j++) printf("%c",ans[i][j]); puts("");}int fans = 1;for(int i=1; i<=num; i++){if(cmp(i,fans)){fans = i;}}for(int j=1; j<=n; j++) printf("%c",ans[fans][j]); puts("");return 0; }

總結

以上是生活随笔為你收集整理的AtCoder AGC037E Reversing and Concatenating的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。