http://acm.hust.edu.cn/vjudge/contest/126262#problem/D
分为3种情况,n=1,n=2,n>=3
其中需要注意的是n=2的情况,通过打表找规律
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <cctype> #include <vector> #include <iterator> #include <set> #include <map> #include <sstream> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define pb push_back #define debug printf("! ") #define MAXN 100000 +5 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define pqueue priority_queue #define INF 0x3f3f3f3f #define ls (rt<<1) #define rs (rt<<1|1) int n,m; char a[MAXN]; int main() { int t,kase=1,i,j,k; sf("%d",&t); while(t--) { sf("%d%d",&n,&m); pf("Case #%d: ",kase++); if(n==1) { for(i=0;i<m;i++) pf("a"); } else if(n==2) { if(m == 1) pf("a"); else if(m==2) pf("ab"); else if(m==3) pf("aab"); else if(m==4) pf("aabb"); else if(m==5) pf("aaaba"); else if(m==6) pf("aaabab"); else if(m==7) pf("aaababb"); else if(m==8) pf("aaababbb"); else { int v = 0; char tmp[] = "aababb"; pf("aa"); for(i=0;i<m-2;i++) { pf("%c",tmp[v++]); v%=6; } } } if(n>=3) { int z = 0; char tmp[] = "abc"; for(i=0;i<m;i++) { pf("%c",tmp[z++]); z%=3; } } blank; } return 0; }
题目很简单,所以我觉得这题最重要的是打表,我把自己打的表贴一下:
思路是用二进制的0和1代替a,b,因为要字典序最小,所以从1111...一直遍历到0就行
int n,m; char a[30]; bool isp(int x,int y) { while(x<y) { if(a[x]!=a[y]) return false; x++;y--; } return true; } int gt() { int len = strlen(a); int ans = 0; for(int i =0;i<len;i++) { for(int j = i;j<len;j++) { if(isp(i,j)) { ans = max(ans,j-i+1); } } } return ans; } void get(int v) { mem(a,0); int k = 0; int tmp = v; while(tmp) { tmp>>=1; k++; } while(v) { a[--k] = 'a' + 1-(v&1); v>>=1; } } int main() { int t,kase=1,i,j,k; for(i=15;i>=0;i--) { int ans,cnt=100; int mx = pow(2,i); int mxx = pow(2,i+1); while(mx<mxx) { get(mxx); //pf("%s %d ",a,gt()); int tmp = gt(); if(cnt>tmp) { ans = mxx; cnt = tmp; } mxx--; } get(ans); pf("%s %d ",a,cnt); blank; } return 0; }