codeforces 265 div2
2014-09-12 00:38
447 查看
div2在做的时候一直没注意到只需要判断“存不存在”回文串这一点。。。。
而判断存不存在回文串只要判断回文中心的存在,即a[i] == a[i+1] || a[i] == a[i+2]
时间复杂度为O(n)。。
于是,我们可以一边构造,一边剪枝。
但是,既然我们可以构造之后再来剪枝,就可以在构造的时候就做出限定,来提高效率。
构造出的第一个长度为n的字符串即为所求。。。
下面的代码是构造后再剪枝的。
而判断存不存在回文串只要判断回文中心的存在,即a[i] == a[i+1] || a[i] == a[i+2]
时间复杂度为O(n)。。
于是,我们可以一边构造,一边剪枝。
但是,既然我们可以构造之后再来剪枝,就可以在构造的时候就做出限定,来提高效率。
构造出的第一个长度为n的字符串即为所求。。。
下面的代码是构造后再剪枝的。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #include <stack> #include <cassert> #include <algorithm> #include <cmath> #include <limits> #include <set> #include <map> using namespace std; #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) a > b ? a : b #define F(i, n) for (int (i)=0;(i)<(n);++(i)) #define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i)) #define IREP(i, s, t) for(int i=s;i>=t;--i) #define REPOK(i, s, t, o) for(int i=s;i<=t && o;++i) #define MEM0(addr, size) memset(addr, 0, size) #define LBIT(x) x&-x #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 #define MAXN 1000 #define MAXM 26 #define MOD 20071027 typedef long long LL; const double maxdouble = numeric_limits<double>::max(); const double eps = 1e-10; const int INF = 0x7FFFFFFF; //#define DEBUG char buf[MAXN + 5]; char ans[MAXN + 5]; bool vis[MAXM + 5]; int n, p; bool init = true; bool check(int len) { if (init && len >= n ) { return false; } if (len-2 >= 0 && ans[len-1] == ans[len-2]) return false; IREP(i, len-2, 1) if (ans[i] == ans[i-1] || ans[i-1] == ans[i+1]) return false; return true; } bool dfs(int step) { if (step >= min(2,n)) { #ifdef DEBUG ans[step] = '\0'; printf("out: %s\n", ans); #endif // DEBUG if (check(step)) { if (step >= n) { init = false; return true; } } else { init = false; return false; } } char c; if (init) c = buf[step]; else c = 'a'; REP(i, c, 'a'+p-1) /*if (!vis[i-'a'])*/ { //vis[i-'a'] = true; ans[step] = i; if(dfs(step+1)) return true; //vis[i-'a'] = false; } return false; } int main() { //freopen("input.in", "r", stdin); cin >> n >> p >> buf; if (dfs(0) == false) cout << "NO\n"; else { ans = '\n'; cout << ans << endl; } return 0; }
相关文章推荐
- Codeforces 464E #265 (Div. 1) E. The Classic Problem 主席树+Hash
- 第十三次codeforces竞技结束 #265 Div 2
- [最短路 主席树 Hash] Codeforces 464E #265 (Div. 1) E. The Classic Problem
- Codeforces #265 Div 1 简要题解
- codeforces 164 Div2 A
- Codeforces-Round-#356-(Div.-2)-Bear-and-Finding-Criminals
- CodeForces 360E Levko and Game(Codeforces Round #210 (Div. 1))
- codeforces 260 div2 B题
- CodeForces 369 div2 E. ZS and The Birthday Paradox 数论
- CodeForces 827C Round#423 Div2E&Div1C Solution:树状数组或其他
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 831E) - 线段树 - 树状数组
- [Codeforces] Round #436 (Div. 2)
- Codeforces Round #383 (Div. 2) && Codeforces 742 B (标记技巧)
- [Codeforces] Round #292 (Div. 2) A、B、C
- codeforces基础题——#358(div2)D
- Codeforces 287(div2)
- codeforces 370 Div2
- Codeforces Round #425 (Div. 2) Problem A Sasha and Sticks (Codeforces 832A)
- codeforces 221 div1 D Tree and Queries
- Codeforces Round #265 (div2) A. inc ARG