AtCoder AGC037E Reversing and Concatenating
生活随笔
收集整理的這篇文章主要介紹了
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}\)就有可能)。
例如以下數據:
因此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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AtCoder AGC037D Sort
- 下一篇: Codeforces 1205C Pal