Manacher算法

 PUBLISHED ON February 01, 2015

一、概述

Manacher算法是一个用来求解最长回文子串(Longest Palindromic Substring)的高效算法。其核心是在枚举回文字串的中心位置,并在计算其对应的回文子串时充分前面的已经算出来的结果。

二、算法原理

首先,需要考虑回文子串长度为奇数和为偶数的情形下的差异,为了消除这一差异,在长度为n的字符串中插入n+1个无关字符,例如'#','*'等。这一步骤时间复杂度为O(n)。 Manacher算法需要O(n)的辅助数组,用来记录每一个位置可以向右扩展回文串的长度(包含其自身),同时,记录当前有最大向右扩展长度的索引位置 id,那么,辅助数组有如下性质:


约瑟夫环问题求解

 PUBLISHED ON February 01, 2015

一、概述

约瑟夫环问题(Josephus)是考察队列的一个经典问题,通常可用循环队列解决,时间复杂度O(m*n),通过数学递推的解法具有O(n)的时间复杂度,是一个很高效的算法。

二、算法原理

约瑟夫环的递推公式:


C语言控制台程序光标位置与文字颜色

 PUBLISHED ON February 01, 2015

Windows平台

控制光标定位

Windows环境下可以通过调用WIN32 API来实现光标定位,具体实现如下:

#include <windows.h>
void gotoxy(int x, int y) {
    COORD cursorPosition;
    cursorPosition.X = x;
    cursorPosition.Y = y;
    // COORD cursorPosition = {x, y};
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPosition);
}

注意:X, Y 的值都是从 0 开始的。


Python yield 关键字

 PUBLISHED ON January 31, 2015

Yield 表达式和声明仅仅用于定义一个“生成器(generator)”函数,并且仅仅用在“生成器”函数的函数体中。使用yield声明足以使得函数定义产生一个generator函数而非一个普通的函数。

Yield expressions and statements are only used when defining a generator function, and are only used in the body of the generator function. Using yield in a function definition is sufficient to cause that definition to create a generator fun instead of a normal function.

The yield statement

yield_stmt ::= yield_expression

yield 声明与yield表达式(yield expression) 在语义上等价。yield声明通常可以省略括号使用然而在yield表倒是中括号是必须的(required)。例如


Cygwin rebaseall

 PUBLISHED ON January 31, 2015

Overview

很多时候在升级Cygwin或安装Cygwin的软件包之后,加载dll会出错,或“fork()”出现错误,并提示“try rebaseall” , 此时,可以通过执行rebaseall命令来解决这些错误。

Required

执行rebaseall命令,需要安装以下软件包

  1. dash (or ash)
  2. rebase

Usage


HihoCoder 1055 题解

 PUBLISHED ON January 25, 2015

一、题目大意

树上每个点都有一个权值,找出与根节点连通的m个点,使得这m个点的权值之和最大。

题目链接: HihoCoder 1055 刷油漆

二、分析

基本思路

树上的动态规划。


Native Bayes Classification

 PUBLISHED ON October 22, 2014

一、概述

朴素贝叶斯分类基于贝叶斯定理,属于有监督的学习过程。在选取特征值恰当的情况下,朴素贝叶斯分类算法有很好的准确率。

二、定义



← Older