题目链接:http://codeforces.com/contest/465/problem/C
题意:给出一个不存在2个或以上回文子串的字符串,全是由小写字母组成而且字母下表小于p,问刚好比这个字符串
大的字符串是什么,如果没有输出NO
题解:就是遍历一遍当前字母要么不变要么增大,如果增大自行构成后续最小。如果等于继续遍历。
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char s[1010]; int a[1010] , c[1010][1010]; int n , p; int main() { scanf("%d%d" , &n , &p); scanf("%s" , s + 1); for(int i = 1 ; i <= n ; i++) { a[i] = s[i] - 'a'; } a[0] = -1; memset(c , -1 , sizeof(c)); for(int i = 1 ; i <= n ; i++) { for(int j = 1 ; j < i ; j++) { c[i][j] = a[j]; } for(int j = a[i] + 1 ; j < p ; j++) { if(i == 1) { c[i][i] = j; break; } else { if(j != a[i - 1] && j != a[i - 2]) { c[i][i] = j; break; } } } for(int j = i + 1 ; j <= n ; j++) { for(int k = 0 ; k < p ; k++) { if(k != c[i][j - 1] && k != c[i][j - 2]) { c[i][j] = k; break; } } } } int flag = 1 , temp = 0; for(int i = n ; i >= 1 ; i--) { flag = 0; temp = i; for(int j = 1 ; j <= n ; j++) { if(c[i][j] == -1) { flag = 1; break; } } if(!flag) break; } if(!flag) { for(int i = 1 ; i <= n ; i++) { char cp = c[temp][i] + 'a'; printf("%c" , cp); } printf(" "); } else { printf("NO "); } return 0; }