反汇编五:类对象存储结构

this指针

在这里插入图片描述
在这里插入图片描述
this指针是常指针
常对象的this指针是指向常量的常指针
由于this指针隐藏传参,所以常对象不能调用普通成员函数

普通成员

在这里插入图片描述

静态数据成员

在这里插入图片描述

类对象 做返回值或参数 值传递 不一定调用构造函数


1.类对象做参数:
没显式调用默认构造函数
逐成员复制到栈上
先定义后压栈

2.类对象 做返回值:
在这里插入图片描述

3.何时提供默认构造函数
在这里插入图片描述

隐藏的虚表和虚表指针


虚表指针:对象前4字节为虚表指针
虚表:虚表保存类定义的虚函数地址,先定义的虚函数排在前面

构造函数

虚表初始化:构造函数取得虚表地址保存在虚表指针

虚指针重写:
在这里插入图片描述
64位系统实例

Derived d;//源码
main函数调用Derived构造函数
   0x0000000000400c3b <+23>:    lea    -0x40(%rbp),%rax
   0x0000000000400c3f <+27>:    mov    %rax,%rdi 
   //通过rdi寄存器传栈变量首地址给构造函数初始化
   0x0000000000400c42 <+30>:    callq  0x400af8 <Derived::Derived()> 
   //直接调用
Dump of assembler code for function Derived::Derived():
   0x0000000000400af8 <+0>:     push   %rbp
   0x0000000000400af9 <+1>:     mov    %rsp,%rbp
   0x0000000000400afc <+4>:     push   %rbx
   0x0000000000400afd <+5>:     sub    $0x18,%rsp
   0x0000000000400b01 <+9>:     mov    %rdi,-0x18(%rbp)  
   //待构造变量的首地址
   0x0000000000400b05 <+13>:    mov    -0x18(%rbp),%rax 
   0x0000000000400b09 <+17>:    mov    %rax,%rdi   
   //再次传给base
   0x0000000000400b0c <+20>:    callq  0x400a1e <Base::Base()>
   0x0000000000400b11 <+25>:    mov    -0x18(%rbp),%rax
   0x0000000000400b15 <+29>:    movq   $0x400e90,(%rax) 
   //虚表指针重写
   //没有参数列表
   0x0000000000400b1c <+36>:    mov    $0x400e4e,%esi  
   //构造函数的函数体
   0x0000000000400b21 <+41>:    mov    $0x6020e0,%edi
   0x0000000000400b26 <+46>:    callq  0x4008d0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x0000000000400b2b <+51>:    mov    $0x4008f0,%esi
   0x0000000000400b30 <+56>:    mov    %rax,%rdi
   0x0000000000400b33 <+59>:    callq  0x4008e0 <_ZNSolsEPFRSoS_E@plt>
   0x0000000000400b38 <+64>:    jmp    0x400b54 <Derived::Derived()+92>    
   //像是根据函数体执行结果,可能失败,就回滚前面创建的base
   0x0000000000400b3a <+66>:    mov    %rax,%rbx
   0x0000000000400b3d <+69>:    mov    -0x18(%rbp),%rax
   0x0000000000400b41 <+73>:    mov    %rax,%rdi
   0x0000000000400b44 <+76>:    callq  0x400a5e <Base::~Base()>
   0x0000000000400b49 <+81>:    mov    %rbx,%rax
   0x0000000000400b4c <+84>:    mov    %rax,%rdi
   0x0000000000400b4f <+87>:    callq  0x400920 <_Unwind_Resume@plt>
   0x0000000000400b54 <+92>:    add    $0x18,%rsp  //恢复栈结构
   0x0000000000400b58 <+96>:    pop    %rbx
   0x0000000000400b59 <+97>:    pop    %rbp
   0x0000000000400b5a <+98>:    retq
Dump of assembler code for function Base::Base():
   0x0000000000400a1e <+0>:     push   %rbp
   0x0000000000400a1f <+1>:     mov    %rsp,%rbp
   0x0000000000400a22 <+4>:     sub    $0x10,%rsp
   0x0000000000400a26 <+8>:     mov    %rdi,-0x8(%rbp) 
   //传入的待构造变量地址
   0x0000000000400a2a <+12>:    mov    -0x8(%rbp),%rax
   0x0000000000400a2e <+16>:    movq   $0x400ed0,(%rax) 
   //虚表地址初始化
   //首地址=this=虚表指针
   0x0000000000400a35 <+23>:    mov    -0x8(%rbp),%rax
   //初始化列表的代码
   0x0000000000400a39 <+27>:    movl   $0x6666,0x8(%rax)
=> 0x0000000000400a40 <+34>:    mov    $0x400e30,%esi 
   //构造函数的函数体
   0x0000000000400a45 <+39>:    mov    $0x6020e0,%edi 
   0x0000000000400a4a <+44>:    callq  0x4008d0 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
   0x0000000000400a4f <+49>:    mov    $0x4008f0,%esi
   0x0000000000400a54 <+54>:    mov    %rax,%rdi
   0x0000000000400a57 <+57>:    callq  0x4008e0 <_ZNSolsEPFRSoS_E@plt>
   0x0000000000400a5c <+62>:    leaveq
   0x0000000000400a5d <+63>:    retq
End of assembler dump.

在这里插入图片描述

析构函数

还原虚表指针:
在这里插入图片描述
在这里插入图片描述
看反汇编码,析构函数在保存bp,获取析构对象首地址后,就回写虚表

Dump of assembler code for function Derived::~Derived():
   0x0000000000400b5c <+0>:     push   %rbp
   0x0000000000400b5d <+1>:     mov    %rsp,%rbp
   0x0000000000400b60 <+4>:     push   %rbx
   0x0000000000400b61 <+5>:     sub    $0x18,%rsp
   0x0000000000400b65 <+9>:     mov    %rdi,-0x18(%rbp)
   0x0000000000400b69 <+13>:    mov    -0x18(%rbp),%rax
   //成员对象为空
   //设置虚表
   0x0000000000400b6d <+17>:    movq   $0x400e90,(%rax)
   //函数体
...........
   //父类析构函数
   0x0000000000400b90 <+52>:    mov    -0x18(%rbp),%rax
   0x0000000000400b94 <+56>:    mov    %rax,%rdi
   0x0000000000400b97 <+59>:    callq  0x400a5e <Base::~Base()>
   //析构子类数据
   //会有类似语句:
   //jmp    0x400bcd <Derived::~Derived()+113>
   //<_ZdlPv@plt>   分析见下面
.........
   0x0000000000400bcd <+113>:   add    $0x18,%rsp
   0x0000000000400bd1 <+117>:   pop    %rbx
   0x0000000000400bd2 <+118>:   pop    %rbp
   0x0000000000400bd3 <+119>:   retq
End of assembler dump.
Dump of assembler code for function Base::~Base():
   0x0000000000400a5e <+0>:     push   %rbp
   0x0000000000400a5f <+1>:     mov    %rsp,%rbp
   0x0000000000400a62 <+4>:     sub    $0x10,%rsp
   0x0000000000400a66 <+8>:     mov    %rdi,-0x8(%rbp)
   0x0000000000400a6a <+12>:    mov    -0x8(%rbp),%rax
   //成员对象为空
   //设置虚表
   0x0000000000400a6e <+16>:    movq   $0x400ed0,(%rax)
........函数体
   0x0000000000400a91 <+51>:    mov    $0x0,%eax
   0x0000000000400a96 <+56>:    test   %eax,%eax
   0x0000000000400a98 <+58>:    je     0x400aa6 <Base::~Base()+72>
   0x0000000000400a9a <+60>:    mov    -0x8(%rbp),%rax
   0x0000000000400a9e <+64>:    mov    %rax,%rdi
   0x0000000000400aa1 <+67>:    callq  0x400880 <_ZdlPv@plt> //见下面
   0x0000000000400aa6 <+72>:    leaveq
   0x0000000000400aa7 <+73>:    retq
End of assembler dump.

<_ZdlPv@plt>

_ZdlPv@plt
再看main反汇编析构部分

   0x0000000000400cbd <+153>:   mov    -0x18(%rbp),%rax
   0x0000000000400cc1 <+157>:   mov    (%rax),%rax
   0x0000000000400cc4 <+160>:   add    $0x8,%rax       //虚表偏移8 
   0x0000000000400cc8 <+164>:   mov    (%rax),%rax
   0x0000000000400ccb <+167>:   mov    -0x18(%rbp),%rdx
   0x0000000000400ccf <+171>:   mov    %rdx,%rdi
   0x0000000000400cd2 <+174>:   callq  *%rax        // delete   pb;
   0x0000000000400cd4 <+176>:   mov    $0x0,%ebx
   0x0000000000400cd9 <+181>:   lea    -0x40(%rbp),%rax
   0x0000000000400cdd <+185>:   mov    %rax,%rdi
   0x0000000000400ce0 <+188>:   callq  0x400b5c <Derived::~Derived()>    //栈变量d析构

derive的析构函数有2个
1、0x400b5c Derived::~Derived() (偏移0字节)
2、虚表偏移8字节

函数2调用函数1,并调用
callq 0x400880 _ZdlPv@plt
函数1为:

(gdb) disassemble  0x00400b5c
Dump of assembler code for function Derived::~Derived():
..........保存调用栈.....
..........rdi中取得入参--隐藏的待析构对象地址.....
..........还原虚表.....
..........函数体......
   0x0000000000400b90 <+52>:    mov    -0x18(%rbp),%rax
   0x0000000000400b94 <+56>:    mov    %rax,%rdi
   0x0000000000400b97 <+59>:    callq  0x400a5e <Base::~Base()>
   0x0000000000400b9c <+64>:    mov    $0x0,%eax
   0x0000000000400ba1 <+69>:    test   %eax,%eax
   0x0000000000400ba3 <+71>:    je     0x400bcd <Derived::~Derived()+113>
   0x0000000000400ba5 <+73>:    mov    -0x18(%rbp),%rax
   0x0000000000400ba9 <+77>:    mov    %rax,%rdi
   0x0000000000400bac <+80>:    callq  0x400880 <_ZdlPv@plt>
   0x0000000000400bb1 <+85>:    jmp    0x400bcd <Derived::~Derived()+113>
   0x0000000000400bb3 <+87>:    mov    %rax,%rbx
   0x0000000000400bb6 <+90>:    mov    -0x18(%rbp),%rax
   0x0000000000400bba <+94>:    mov    %rax,%rdi
   0x0000000000400bbd <+97>:    callq  0x400a5e <Base::~Base()>
   0x0000000000400bc2 <+102>:   mov    %rbx,%rax
   0x0000000000400bc5 <+105>:   mov    %rax,%rdi
   0x0000000000400bc8 <+108>:   callq  0x400920 <_Unwind_Resume@plt>
   0x0000000000400bcd <+113>:   add    $0x18,%rsp
   0x0000000000400bd1 <+117>:   pop    %rbx
   0x0000000000400bd2 <+118>:   pop    %rbp
   0x0000000000400bd3 <+119>:   retq
End of assembler dump.

(待补充。。。。
mov $0x0,%eax
test %eax,%eax
je 0x400bcd Derived::~Derived()+113
这些命令,实际执行时会跳转

虚析构函数:
在这里插入图片描述

多态


指针对象通过虚表间接调用虚函数
普通对象直接调用自己定义的函数

    Base b;
    Derived d;
    ....
    d.f();
    .....
    pb=&b;
    pb->f();
   0x0000000000400c5b <+55>:    lea    -0x40(%rbp),%rax
   0x0000000000400c5f <+59>:    mov    %rax,%rdi
   0x0000000000400c62 <+62>:    callq  0x400bfa <Derived::f()>                  //d.f();
   0x0000000000400c67 <+67>:    lea    -0x30(%rbp),%rax  //pb=&b;
   0x0000000000400c6b <+71>:    mov    %rax,-0x18(%rbp) 
   0x0000000000400c6f <+75>:    mov    -0x18(%rbp),%rax  
   0x0000000000400c73 <+79>:    mov    (%rax),%rax    //取虚表
   0x0000000000400c76 <+82>:    add    $0x10,%rax                   
   //虚表偏移10
   0x0000000000400c7a <+86>:    mov    (%rax),%rax
   0x0000000000400c7d <+89>:    mov    -0x18(%rbp),%rdx
   0x0000000000400c81 <+93>:    mov    %rdx,%rdi
   0x0000000000400c84 <+96>:    callq  *%rax                          
   //pb->f();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct identifier [:interfaces] body [;] 结构与类很相似,都表示可以包含数据成员和函数成员的数据结构。与类不同的是,结构是值类型并且不需要堆分配。结构类型的变量直接包含结构的数据,而类类型的变量包含对数据的引用(该变量称为对象)。 struct 类型适合表示如点、矩形和颜色这样的轻量对象。尽管可能将一个点表示为类,但结构在某些方案中更有效。在一些情况下,结构的成本较低。例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。结构可以声明构造函数,但它们必须带参数。声明结构的默认(无参数)构造函数是错误的。总是提供默认构造函数以将结构成员初始化为它们的默认值。在结构中初始化实例字段是错误的。在类中,必须初始化实例对象. 使用 new 运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用 new 运算符。如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承,而且不能作为一个类的基。但是,结构从基类 Object 继承。结构可实现接口,其方式同类完全一样。 [c ] 与 C 不同,无法使用 struct 关键字声明类。在 C# 中,类与结构在语义上是不同的。结构是值类型,而类是引用类型。 2, 装箱和拆箱(取消装箱) 装箱是值类型到 object 类型或到该值类型所实现的任何接口类型的隐式转换。将一个值的值装箱会分配一个对象实例并将该值复制到新的对象中。关键字 object. 取消装箱是从 object 类型到值类型或从接口类型到实现该接口的值类型的显式转换。取消装箱操作包括:检查对象实例,确保它是给定值类型的一个装箱值。将该值从实例复制到值类型变量中。 例: int i = 123; // A value type object box = i; // Boxing int j = (int)box; // Unboxing 装箱转换 取消装箱 3 , 隐式和显式 下列转换属于隐式转换:例:object o=i; 标识转换。 隐式数值转换。 隐式枚举转换。 隐式引用转换。 装箱转换。 隐式常数表达式转换。 用户定义的隐式转换。 下列转换属于显式转换: object 0=(object)i; 所有隐式转换。 显式数值转换。 显式枚举转换。 显式引用转换。 显式接口转换。 取消装箱转换。 用户定义的显式转换 4, delegate(委托) delegate void D(int x); class C{ public static void M1(int i) { /* ... */ } public static void M2(int i) { /* ... */ }} class{…….D cd1 = new D(C.M1);………….} 委托是一个数据结构,该数据结构引用一个静态方法,或引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针不同,委托是完全面对对象的;与指向成员函数的 C 指针不同,委托同时封装对象实例和方法。委托声明定义从类 System.Delegate 派生的类。委托实例封装一个或多个方法,每个方法都被称为可调用实体。对于实例方法,可调用实体由一个实例和该实例上的方法组成。对于静态方法,可调用实体仅由一个方法组成。给定委托实例和适当的参数集,便可以用该参数集调用此委托实例的所有方法。委托实例的一个有趣和有用的属性是它不了解或不关心它所封装的方法的类;真正重要的只是方法要与委托的类型兼容, 这使委托非常适合“匿名”调用。可选的形参表指定委托的参数,而返回类型则指示委托的返回类型。如果下面两个条件都为真,则方法和委托类型是兼容的:(兼容的概念就是可以用此声明的委托对方法进行委托). 1它们具有相同的参数数目,并且类型相同,顺序相同,参数修饰符也相同。 2它们的返回类型相同。 C# 中的委托类型是名称等效的,而不是结构等效的。(但是请注意:两个不同但结构上等效的委托类型的实例可能会比较为相等),准确地说,两个具有相同参数列表、签名和返回类型的不同的委托类型被认为是不同的委托类型。委托实例所封装的方法集合称为调用列表。 5, interface(接口) [attributes] [modifiers] interface identifier [:base-list] {interface-body}[;] 一个接口定义一个协定。实现接口的类或结构必须遵守其协定。接口可以从多个基接口继承,而类或结构可以实现多个接口。接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。接口可以是命名空间或类的成员,并且可以包含下列成员的签名:方法属性 索引器. 一个接口可从一个或多个基接口继承。接口可由类实现。实现的接口的标识符出现在类的基列表中。被继承的接口称为该接口的显式基接口。当接口具有一个或多个显式基接口时,在该接口声明中,接口标识符后跟一个冒号以及由逗号分隔的基接口标识符列表。接口的基接口是显式基接口及其基接口。换言之,基接口集是显式基接口、它们的显式基接口(依此类推)的完全可传递的闭包。接口继承其基接口的所有成员。接口成员是通过 I.M 和 I[A] 形式的成员访问和索引访问表达式访问的,其中 I 是接口类型的实例,M 是该接口类型的方法、属性或事件,A 是索引器参数列表。接口可以由类和结构实现。为了指示类或结构实现接口,在该类或结构的基类列表中包含了接口标识符。在实现类或结构中定位接口成员的实现的过程称为接口映射。 6,object object 类类型是所有其他类型的最终基类。C# 中的每种类型都是直接或间接从 object 类类型派生的。可以把任何类型的数值给object类型. 7,string类型 string 类的实例表示 Unicode 字符串。尽管 string 是引用类型,但相等运算符(== 和 !=)被定义为比较 string 对象(而不是引用)的“值”(7.9.7 字符串相等运算符)。这使得对字符串相等性的测试更为直观。字符串为 string 类型并可写成两种形式,即用引号引起来和用 @ 引起来。用引号引起来的字符串括在双引号 (") 内, 并且可以包含包括换码序列在内的任何字符用 @ 引起来的字符串以 @ 开头,并用双引号引起来。用 @ 引起来的字符串以 @ 开头,并用双引号引起来。若要在一个用 @ 引起来的字符串中包括一个双引号,请使用两对双引号:@ 符号的另一种用法是使用碰巧成为 C# 关键字的被引用的 (/reference) 标识符。 8, 修饰符 修饰符作用 访问修饰符 public private internal protected 指定声明的类型和类型成员的可访问性。 访问不受限制 只有包含该类的成员的类可以访问 只有当前工程可以访问 只有包含该成员的类和继承的类可以访问 abstract指示某个类只能是其他类的基类。 const指定无法修改字段或局部变量的值。 event声明一个事件。 extern指示外部实现此方法。 override提供从基类继承的虚拟成员的新实现。 readonly声明一个字段,该字段只能赋值为该声明的一部分或者在同一类的构造函数中。 sealed指定类不能被继承。 static声明属于类型本身而不是属于特定对象的成员。 unsafe声明不安全的上下文。 virtual在派生类中声明其实现可由重写成员更改的方法或访问器。 volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代语句do, for, foreach, in, while 跳转语句break, continue, default, goto, return 异常处理语句throw, try-catch, try-finally Checked 和 Uncheckedchecked, unchecked fixed 语句Fixed lock 语句Lock (1) foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下: foreach (type identifier in expression) statement 若要循环访问集合,集合必须满足特定的要求。集合类型: 必须是 interface、class 或 struct。 必须包括返回类型的名为 GetEnumerator 的实例方法,例如 Enumerator(详见下文)。 Enumerator 类型(类或结构)必须包含: 一个名为 Current 的属性,它返回 ItemType 或者可以转换为此类型的类型。属性访问器返回集合的当前元素。 · 一个名为 MoveNext 的 bool 方法,它递增项计数器并在集合中存在更多项时返回 true。 有三种使用集合的方法: 使用上述指导创建一个集合。此集合只能用于 C# 程序。 1. 使用上述指导创建一个一般集合,另外实现 IEnumerable 接口。此集合可用于其他语言(如 Visual Basic)。 2. 在集合类中使用一个预定义的集合。 (2) throw 语句用于发出在程序执行期间出现常情况(异常)的信号。throw 语句的形式为: throw [expression]; expression :异常对象。当在 catch 子句中再次引发当前异常对象时,它被省略。 (3)try –catch语句 try-catch 语句由一个 try 块和其后所跟的一个或多个 catch 子句(为不同的异常指定处理程序)构成。try-catch 语句采用下列形式之一: try try-block catch (exception-declaration-1) catch-block-1 catch (exception-declaration-2) catch-block-2 ... try try-block catch catch-block (4) fixed 防止变量被垃圾回收器重定位。 (5) lock lock 关键字将某个语句块标记为临界区。 6. 方法参数 如果为没有 ref 或 out 的方法声明一个参数,则此参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。如果没有ref,out则默认为值传递,虽然可以在方法中修改这个参数的值,但是修改后的值不会还会到调用该方法的程序中. params :params 关键字可以指定在参数数目可变处采用参数的方法参数 ref :引用传递 out : 7, namespace(名字空间) C#学习笔记(2)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2004-07-11 人气:8092 出处: write by cash(天下第七) 2002.01.20 版权所有,翻录不究 cashcao@msn.com 选择 我身上携带着精神、信仰、灵魂 思想、欲望、怪癖、邪念、狐臭 它们寄生于我身体的家      我必须平等对待我的每一位客人 -----------伊沙:《原则》 我的名字是cash,所以我很功利主义; 我的星像是Leo,所以我很大男人主义; 我的语言是C#,所以我有点儿拿不定主义。 /* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇怪。有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信这世上有一种力量直接来自于爱情,到现在仍然相信。*/ C#(读作C sharp),是Microsoft公司新推出的(?)专为.NET设计的一门语言,号称“C/C++家族中第一种面向组件的语言”。很多人觉得它应该像C或者C++,但事实上它更像是java的一个clone,所以作为入门,读一下清华大学出版社出版的《Java 语言与面向对象程序设计》可能会对你有所帮助。本文假定你具备一切学习此语言所需的知识,没有也不要紧,我会在文中尽量列出相关的link,鉴于互联网瞬息万变的特点,若某一链接不可用,请自行至Google查询。 如前所述,我是一个狮子座男人,一度我认为学习Java会使我看起来与众不同,可是几个月以后我放弃了这个选择,我看了论坛里关于这两种语言孰优孰劣的讨论,最终选择了C#,请不要问我为何做出这样的选择,很多人认为中文是世界上最美丽的语言,可是华人世界以外有谁在讲汉语? 另外我发现论坛上学习Java的人都非常的有个性,当有人问起学习哪种语言更好时,他会打出几百个“JAVA”来,填满整个屏幕,也不说是为了什么。我觉得这样做未免有些太霸道了,如果你说这叫偏执狂我也不对,虽然我是狮子座,可也不想被人这样看。 在C#刚刚推出的时候,大多数的程序员都不免吼上两句——不是因为高兴,而是因为又多了一种语言。他们觉得现在的语言太多了,没有必要再多出一种来添乱子。但是当他们看完C#的文档后又开始高兴起来,因为C#是如此简单:事实上,简单正是C#最大的特点。除此之外,它还具有现代、面向对象、类型安全、版本控制、兼容、灵活等特点。详细介绍请参阅rainbow(一个长着胡子的彩虹)翻译的<> ,前几章非常的有趣。 看完了前面几段,我的朋友提出了不同的意见:C#不是Java的Clone,它只是长得有些像Java而已,其实面向对象、中间语言什么的也不是什么新玩意儿,非Sun独创,有文为证:华山论剑:C#对Java。另外他对我上一集中说Microsoft越来越不要脸也极为生气,因为相比之下,Sun也不怎么样,微软已经将C#提交设在日内瓦的ECMA(European Computer Manufacturers' Association,国际标准化机构欧洲电子计算机工业会)并获得批准。Sun就从来没有将它的Java交给过ECMA,以至于正当Microsoft尽力在Visual J++基础上拓展Java功能,并使之与Windows操作系统紧密结合在一起的时候,Sun公司对Microsoft提出了法律诉讼,控告Microsoft违了许可证协议中的条款,最终的结果是Microsoft公司不得不停止其Visual J++产品的开发。(Microsoft后来在完全面向.NET框架的开发语言集中加入了Visual J#.NET,算是对Java语言用户的一种照顾。) 有人说,选择C#意味着选择MS(在中国的程序员当中,这并不是件值得自豪的事。如果你还不能理解这种心情,可以试想一下有人很认真地对你讲他喜欢听毛宁的歌)。事实上,通过ECMA标准的C#可以由任何人在任何平台上设计出它的开发程序。比如Ximian公司的Mono工程,可以使开发者能够编写同时在Windows和Linux上运行的.Net程序,这些程序甚至还可能在其它非Windows的操作系统上运行,比方Unix。这一段时间我正在Linux下试验这个工程,遗憾的是,还没有成功。 一位师兄对此种比较颇为不屑,他认为只要选一种语言去学就好了,“重要的是你要用它,并且做的比别人好。”这让我想起来一直都很喜欢的那个歌:把你自己该做的那份工作,做得比别人出色。年轻的时候我老是用这句话自勉…… 写到这里我发现这个故事还没有提到桐桐,这篇东西是为她而作。我早在十八个月以前就答应了她,我答应了她很多事,但还没有完成一件,现在我要一件一件的去实现。所以这个故事还应该有个更好的开始。 2000年6月我大学毕业,从北京回到了石家庄,到一家什么都做的公司上班(做一个网站),最开始制作界面,然后用asp编程,如果你用过asp就会知道,这是个很无聊的工种。在此之前我在一家报社实习,为他们的网站做设计和动画。在那里我认识了桐桐。 那时候她还在上学。 >>>未完,待续... C#学习笔记(3)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2004-07-11 人气:6938 出处: 开始 2000年6月我大学毕业,从北京回到了石家庄,正式开始了我的职业生涯。如前所述,一开始我使用的语言是asp,我一直认为这不能称之为编程,因为asp不是一种编程语言,把它叫做动态网页实现技术可能更好。另外,asp很简单,并且,简单就是它全部的特点--这使得它很容易就能学会(在后来的工作中,我接触到许多应聘的学生,他们都告诉我自己精通asp语言)。虽然学习起来很简单,但是在使用起来却不得不多费点儿劲儿:我还能记得自己晚上一个人在办公室用VI一步一步调试某一个网页的情景,每当遇到挫折失败的时候,总是想起给桐桐打一个电话,听听她的声音。如你所知,我总是遇到困难。 现在你能看出来,我不是高手,只是一个低手... 2000年6月我大学毕业,从北京回到了石家庄,同一时间(美国西部时间6月22日上午),微软公司在位于美国西雅图郊外的总部内邀请新闻记者、新闻分析家等约400人,举行了新闻发布会“Forum2000”,宣布正式推出.Net计划。这个计划中包括了新的网络计算平台(.Net Framework)、新的语言(C#)、新的开发工具(Visual Studio.Net)以及asp的下一个版本ASP.NET,后者最开始被称为ASP+。那时候我学习的主要兴趣就在ASP.NET上,并且通过这个窗口开始了解Microsoft.Net的各个方面。 ASP.NET仍然不能称之为一种编程语言,但是现在可以把它看作是一个创建、管理、部署Web应用程序的平台。可以使用任何.Net语言在这个平台上开发互联网应用程序,这其中当然包括C#。它们之间的关系可以从下图中看出: 这就是著名的.Net 平台结构图,从这个图上可以看到,ASP.NET、Windows Forms和VS.Net都不过是.Net开发平台的一部分,用于.Net应用程序的开发及展示。.Net 平台的核心技术为:通用语言运行时(CLR:Common Language Runtime)、基类库(Base Class Library)、.Net语言及Visual Studio.Net。 从这个图上也可以看出,.Net Framework是架构在Windows平台上的一个虚拟的运行平台,你可以想象将最下层的Windows换作其它的操作系统,比如说Linux,一样可以实现使用符合了CLS(Common Language Specification,通用语言规范)的.Net语言(VB.Net、C#、JScript.Net等)来创建ASP.NET或Windows Forms(可能会叫做Linux Forms)应用程序的功能,这其实就是我们前面介绍的Mono计划所要实现的功能。所以可以这么认为,理论上,C#是一种可以跨平台的语言,这很像Java,另一个比较像Java的地方是,C#也是一种(特殊意义上的)解释性的语言。同Java一样,C#编写的程序代码也是先通过C#编译器编译为一种特殊的字节代码(中间语言,Microsoft Intermediate Language,MSIL),运行的时候再经由特定的编译器(JIT编译器,Just In Time,JITer)编译为机器代码以供操作系统执行。 不仅是C#语言,所有.Net语言(将会包括我们常用的几十种现代的编程语言)都可以编写面向CLR的程序代码,这种代码在.Net中被称为托管代码(Managed Code),所有的Managed Code都直接运行在CLR上,具有与平台无关的特性。 解释性的语言很安全,并且可以通过它的运行平台为其赋予更多的功能,比如自动内存管理、异常处理等。事实上,C#语言的许多特点都是由CLR提供的,下面的CLR结构图说明了这一点。 可以看到,类型安全(Type Checker)、垃圾回收(Garbage Collector)、异常处理(Exception Manager)、向下兼容(COM Marshaler)、多线程支持(Thread Support)这些C#的特点都是由CLR来提供的。CLR最早被称为下一代Windows服务运行时(NGWS Runtime),是直接建立在操作系统层上的一个虚拟的运行环境,主要的功能是管理代码的运行。在.Net 平台结构图中,CLR的上面是.Net的基类库(Base Class Library,BCL),这组基类库包括了从基本输入输出到数据访问等各方面,提供了一个统一的面向对象的、层次化的、可扩展的编程接口。从.Net 平台结构图中也可以看到,基类库可以被各种语言调用和扩展,也就是说,不管是C#、VB.NET还是VC++.NET,都可以自由地调用.Net的基类库。事实上, C#并没有属于自己的类库,它所使用的编程接口就是.Net提供的基类库。所以,在决定使用C#时,真正需要费工夫学习的其实是.NET框架的基类库:C#自身只有区区77个关键词,而且其语法对许多程序员来说都是他们非常熟悉的。BCL则相,它包含了超过4500个以上的类和无数的方法、属性,在你的C# 程序中随时都可能会用到它来完成自己的任务。 很多人都思考过应如何开始学习一种新的语言,对于一个有经验的编程人员来讲,这确非难事。但是对于一个对编写代码一无所知的人而言,如果你是以C#开始你的编程之旅的,数目繁多的概念及新名词可能会令你有些不知所措。这时候请注意你的学习顺序,任何一种编程语言的学习都是按照运行平台、语法、基类库直至各方面的应用这一顺序来进行的,但是在实际的学习中,它们之间并不是孤立的。推荐的方法是:对运行平台和语法有了一个整体的认识后,在应用中学习各种基类库的用法。鉴于C#这一语言的特殊性,全面了解它的运行平台(.Net Framework)必会使你的学习事半功倍。所以请记住上面提到的两个图,在以后的学习中,虽然可能不会明确的涉及到它们,但是在整个C#的学习过程中,它们却是无处不在的。 还有一个很重要的概念需要你明白,这就是公共语言架构(Common Language Infrastructure ,CLI)。CLI是CLR的一个子集,也就是.NET中最终对编译成MSIL代码的应用程序的运行环境进行管理的那一部分。在CLR结构图中CLI位于下半部分,主要包括类加载器(Class Loader)、实时编译器(IL To Native Compilers)和一个运行时环境的垃圾收集器(Garbage Collector)。CLI是.Net和CLR的灵魂,CLI为IL代码提供运行的环境,你可以将使用任何语言编写的代码通过其特定的编译器转换为MSIL代码之后运行其上,甚至还可以自己写MSIL代码在CLI上面运行。如你所知,欧洲计算机制造商协会(ECMA)已经于2001年10月13日批准C#语言规范(ECMA-334)成为一种新诞生的计算机产业标准。同时国际标准组织ISO也同意该标准进入该组织的审批阶段。并且,作为.Net与CLR的核心部分,CLI与C#也同时获得了ECMA的批准(ECMA-335)。拥有了C#与CLI这两项标准,你可以自己写出能够运行于任何操作系统上的.Net平台(只要你愿意)。如前所述,著名的Mono项目就是这么干的,Mono项目包括三个核心的部分:一个C#语言的编译器,一个CLI和一个类库。在Java的世界中,这项工作是由SUN公司完成的,SUN针对不同的操作系统开发出相应的Java虚拟机以便让一个由Java开发的应用程序运行在不同的操作系统上,但是迄今为止还没听说过微软有这方面打算(为用户提供非Windows系统的.Net平台)。 2000年的6月还有很多事情发生,2000年的6月我在学校做毕设,晚上就跑到系试验室看欧锦赛,我很喜欢的坎普君(Bergkamp)大放异彩,帮助荷兰队6比1大胜南斯拉夫,米哈伊洛维奇 (Mihajlovic)在比赛最后莫名的笑容永远留在了我的心中。说实话,那时候只顾着看EURO2000,可没管什么.Net、.Not。另外,离别的愁绪围绕在每个人的周围,广播里开始复复播放一些古老的歌曲,不知道为什么,恋曲1980却是那时候的最爱。 后来,我们都毕了业。如你所知,我离开了北京。 >>>未完,待续... C#学习笔记(4)【大 中 小】【打印】【加入收藏】【关闭】 【收藏到新浪ViVi】【收藏到365KEY】 浏览字号:日期:2004-07-11 人气:8360 出处: 约定 //一个典型的用C#写就的HelloWorld程序 using System; class HelloWorld { public static void Main() { Console.WriteLine("Hello World !"); } } 我忘记自己第一次用C#向世界问好是在什么时候了,不过可以肯定我已经打过招呼了,那时候用的是beta1版。现在你可以到http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml去下载.Net Framework Software Development Kit (SDK)的正式版,其中包括了前面提到的.NET Framework, 以及书写、编译、测试、开发 .NET Framework 应用程序所需要的一切——文档、例子、命令行工具和编译器。安装之后就可以开发和运行C#程序了,不过一般的建议是:一定要看.Net Framework SDK中所带的文档与例子,如果能照着例子再写一遍那就再好不过了。 当我第一次看到C#代码的时候,同样认为它很像Java,一个形象的比喻是:C#和Java是一对双胞胎,从语法的角度来讲,它们共同的父亲当然非C++莫属(请注意,不是VC++)。对于一个学过Java语言的人来说(比如说在下),要理解这段代码实在是太容易了:第一行当然是注释了,C#支持两种注释方法,以"//"开始的单行注释和以"/*"、"*/"配对使用的多行注释。第二行(using System)导入了System这个包(在C#中被称之为名字空间,Namespace),可以让我们方便的调用Microsoft.Net基类库System中的所有类,在此例中使用了System名字空间中的"Console"类,用于在控制台窗口输出程序运行结果。如前所述,C#并没有内置的输入输出语句,所有需实现的功能都完全来自于.Net基类库。这一句的作用就是告诉编译器去哪里寻找Console类以便调用。 接下来声明了一个类HelloWorld,这个类中有一个特殊的方法Main(),每个可执行文件都需要有一个入口点,在C#中,这个入口点就是Main()方法,此方法将在程序启动时被调用。在这个方法中,Console是在命名空间System下的一个类,它表示的是控制台。这里调用其静态方法WriteLine()。如同C++一样,静态方法允许我们直接作用于类而非实例对象。WriteLine()函数接受字符串类型的参数"Hello World !",并把它送入控制台显示。如前所述,C#没有自己的类库,它直接获取Microsoft.NET系统类库。在这里正是通过获取Microsoft.NET系统类库中的System.Console.WriteLine()来完成我们想要的控制台输出操作。现在使用记事本来编写这段代码,并将它的文件名保存为HelloWorld.cs,其中".cs"是C#源代码文件的扩展名。然后在配置好C#编译器的命令行环境里键入"csc HelloWorld.cs"编译文件。可以看到编译输出文件HelloWorld.exe。键入HelloWorld执行这个文件可得到下面的输出: Hello World ! 这就是第一个C#的程序,我们使用csc.exe来编译它,对于这个C#编译器,有如下说明: 1. 它是随.Net Framework SDK免费发布的,可以在DOS命令行被调用 2. 它的使用方法如下:   csc SourceFile.cs /out:TargetFile.exe   如果不使用输出参数指定目标文件名,则默认输出为源文件名 3. 一般情况下,它在系统文件夹(Windows或WinNT)下的Microsoft.NET\Framework\v1.0.3705文件夹内 4. 如果你安装了VS.Net,从Visual Studio.NET Tools项目组中可以激活Visual Studio.NET Command Prompt窗口,这是一个配置好C#编译器的命令行环境 5. 使用csc.exe编译后的C#程序并不是机器代码(尽管拥有.exe的后缀名)。如前所述,C#程序只是被编译成了MSIL代码。 C#编译器(csc.exe)编译后的文件并不是一个严格意义上的可执行文件(并不包含机器代码),而是一个PE(portable executable)格式的文件,虽然它同样拥有.exe的后缀名。在这个PE文件中也不仅仅只包含中间语言,在其中还包含有元数据(Metadata)和一个由编译器添加的目标平台的标准可执行文件头。 中间语言,确切地说,应该称为微软中间语言(Microsoft Intermediate Language,MSIL),是由微软定义的一种界于源代码与机器码之间的一种语言。在CLR中,它首先会由特定的语言编译器将其包装成exe格式的伪代码(P代码)。再由特定的编译器将其转换为本地代码执行。对于微软中间语言,一个形象的比喻是:如果CLR是操作系统的话,那么微软中间语言就是.Net平台上的ASM汇编语言。它比大多数 CPU 机器语言更为高级,比如它可以理解对象类型,并具有创建和初始化对象、调用关于对象的虚拟方法以及直接操作处理数组元素的指令。它甚至还具有发现和捕获异常情况用于错误处理的指令。 元数据(Metadata)和MSIL共同存在于编译好的程序文件之中,描述了此程序包含的类型的定义、各种类型的签名及其它一些数据,相当于以前的类型库(Type Library),同时也记载了此程序所引用到的其它外部类。元数据的主要作用是将与代码有关的更多的信息提供给CLR。基本上,元数据用于如下各项任务:用于表示CLR用途的信息,如定位和装载类、内存中这些类的实例、解决调用、翻译IL为原始码、加强安全并设置运行时上下文边界。 一个由C#语言写就的源码文件在CLR环境中执行的过程是这样的:首先由C#编译器编译成包含了中间语言和元数据的PE文件,当我们在系统中调用这个文件时,CLR会启动一个编译器再将这个PE文件包含的MSIL代码转换成为托管的本地代码。转换MSIL代码为本地码的这个编译器就叫做JIT编译器(Just In Time,JITer)。请注意它并不是前面我们用到的C#编译器。 现在让我们看看JIT编译器是如何工作的:当PE文件被调用时,JIE编译器将其分解为MSIL和元数据,这时候MSIL并不直接让.Net去调用本地的系统接口,而是指定.Net系统去编译连接那些需要的CLR DLL,编译出百分之百的本地代码。整个的过程如下: 当一个类型被装载时,装载器创建一个存根(stub),并使它与类型的每一个方法相连接。当一个方法第一次被调用时,存根把控制交给JITer。JITer把MSIL编译为本地代码,并且把存根指针指向缓冲本地代码。已经被JITer编译的方法随后就直接调用已经产生的本地代码,减少了JITer编译和执行代码的时间。可以看到,JITer并不会一次性的将所有的MSIL都编译为本地代码,而是在我们需要时才即时编译,也就是说,有些代码可能从来都没有被编译过。很明显这样做的好处是既保证了运行期的安全性,又不会损失太多的效率。 这就是一个C#程序执行时的步骤。整个过程是这样的: 1) 由C#编译器将源代码编译为中间语言 2) 装入托管代码,这包括解决内存中的名字、表层类(laying out classes ),并且创建JIT编译所必需的存根。通过执行经常性校验,包括加强一些访问规则,类装载器同样也增强了安全性 3) 用JITer将 IL转换成原始代码 4) 装入元数据、校验类型安全和方法的完整性 5) 垃圾收集(GC)和异常处理 6) 描绘和查错服务 7) 管理线程和上下文以及远程管理。 不必全部理解这些概念,在以后的学习中将会一一的体会到它们的精彩,现在你需要做的(如果你还没这么干过的话),是找到ildasm.exe这个文件(一般情况下,它会和csc.exe在同一文件夹中)。顾名思义,这是一个MSIL的汇编程序(.Net Framework IL Disassembler),在命令行窗口下输入ildasm helloworld.exe /out=helloworld.il就会得到两个文件:helloworld.il和helloworld.res。前者包括了编译出来的元数据和MSIL代码,后者则是提取的资源文件。用记事本打开helloworld.il文件,可以看到它定义并实现了一个继承自System.Object 的HelloWorld类及两个函数:Main()和.ctor()。其中.ctor()是HelloWorld类的构造函数。在这个文件中还包括元数据和其它有关的信息。如果你觉得这样不够直观的话,可以在命令行窗口键入ildasm helloworld.exe,这样就可以启动ILDASM 窗口并向我们展示出编译后的helloworld.exe文件。 请仔细将这些代码看上几遍,现在理解全部这些内容并不重要,但是希望你也能看一下文件中的元数据,这其中包含所有 Runtime 和编译器需要的有关程序集及其模块、类型和成员(如方法)的信息。 行文至此,我想谈一下学习。如你所知,在我们所处的环境中,学习总意味着是一个痛苦的过程,学习一种新知识好像总是为了自己的某种需求,我并不认为这样有什么不对,但我总觉着,除了拿到高薪和受人尊敬外,学习还应该带给我们更多的快乐。有些知识我们现在也许用不着,比如前面谈到的一些内容,但是我们了解了,就是一件值得高兴的事。 智慧本身就是好的,有一天我们都会死去,追求智慧的道路还会有人在走着。死掉以后的事我看不到。但在我活着的时候,想到这件事,心里就高兴。 ——王小波 今天是2002年4月7号,再过三天就是王小波的忌日了,不知道有多少人还会记得这个日子,还会记得这个人。本文的最后,我向大家推荐小波的作品——每一个心智成熟的人都应该读一读小波的文字。在他的杂文随笔集《沉默的大多数》中有一句话谈到了他作为程序员的一面: “今晚不把这段C++调通,老子就不睡了!” >>>未完,待续...
# 国家集训队论文列表(1999-2019) ___点击目录快速跳转:___ - _国家集训队论文列表(1999-2019)_ * [_1999_](#1999) * [_2000_](#2000) * [_2001_](#2001) * [_2002_](#2002) * [_2003_](#2003) * [_2004_](#2004) * [_2005_](#2005) * [_2006_](#2006) * [_2007_](#2007) * [_2008_](#2008) * [_2009_](#2009) * _2010~2012:组委会暂停论文答辩项目_ * [_2013_](#2013) * [_2014_](#2014) * [_2015_](#2015) * [_2016_](#2016) * [_2017_](#2017) * [_2018_](#2018) * [_2019_](#2019) - _论文分类汇总(1999-2009)_ * [组合数学](#组合数学) + [计数与统计](#计数与统计) + [数位问题](#数位问题) + [动态统计](#动态统计) + [博弈](#博弈) + [母函数](#母函数) + [拟阵](#拟阵) + [线性规划](#线性规划) + [置换群](#置换群) + [问答交互](#问答交互) + [猜数问题](#猜数问题) * [数据结构](#数据结构) + [数据结构](#数据结构-1) + [结构联合](#结构联合) + [块状链表](#块状链表) + [动态树](#动态树) + [左偏树](#左偏树) + [跳表](#跳表) + [SBT](#sbt) + [线段树](#线段树) + [单调队列](#单调队列) + [哈希表](#哈希表) + [Splay](#splay) * [图论](#图论) + [图论](#图论-1) + [模型建立](#模型建立) + [网络流](#网络流) + [最短路](#最短路) + [欧拉路](#欧拉路) + [差分约束系统](#差分约束系统) + [平面图](#平面图) + [2-SAT](#2-sat) + [最小生成树](#最小生成树) + [二分图](#二分图) + [Voronoi图](#voronoi图) + [偶图](#偶图) * [树](#树) + [树](#树-1) + [路径问题](#路径问题) + [最近公共祖先](#最近公共祖先) + [划分问题](#划分问题) * [数论](#数论) + [欧几里得算法](#欧几里得算法) + [同余方程](#同余方程) * [搜索](#搜索) + [搜索](#搜索-1) + [启发式](#启发式) + [优化](#优化) * [背包问题](#背包问题) * [匹配](#匹配) * [概率](#概率) + [概率](#概率-1) + [数学期望](#数学期望) * [字符串](#字符串) + [字符串](#字符串-1) + [多串匹配](#多串匹配) + [后缀数组](#后缀数组) + [字符串匹配](#字符串匹配) * [动态规划](#动态规划) + [动态规划](#动态规划-1) + [状态压缩](#状态压缩) + [状态设计](#状态设计) + [树形DP](#树形dp) + [优化](#优化-1) * [计算几何](#计算几何) + [立体几何](#立体几何) + [计算几何思想](#计算几何思想) + [圆](#圆) + [半平面交](#半平面交) * [矩阵](#矩阵) + [矩阵](#矩阵-1) + [高斯消元](#高斯消元) * [数学方法](#数学方法) + [数学思想](#数学思想) + [数学归纳法](#数学归纳法) + [多项式](#多项式) + [数形结合](#数形结合) + [黄金分割](#黄金分割) * [其他算法](#其他算法) + [遗传算法](#遗传算法) + [信息论](#信息论) + [染色与构造](#染色与构造) * [一类问题](#一类问题) + [区间](#区间) + [序](#序) + [系](#系) + [物理问题](#物理问题) + [编码与译码](#编码与译码) + [对策问题](#对策问题) * [优化](#优化-2) + [算法优化](#算法优化) + [程序优化](#程序优化) + [语言](#语言) * [策略](#策略) + [策略](#策略-1) + [倍增](#倍增) + [二分](#二分) + [调整](#调整) + [随机化](#随机化) + [非完美算法](#非完美算法) + [提交答案题](#提交答案题) + [守恒思想](#守恒思想) + [极限法](#极限法) + [贪心](#贪心) + [压缩法](#压缩法) + [逆向思维](#逆向思维) + [穷举](#穷举) + [目标转换](#目标转换) + [类比](#类比) + [分割与合并](#分割与合并) + [平衡思想](#平衡思想) Table of contents generated with markdown-toc --- ## 1999 陈 宏 -《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》 来煜坤 -《把握本质,灵活运用——动态规划的深入探讨》 齐 鑫 -《搜索方法中的剪枝优化》 邵 铮 -《数学模型的建立、比较和应用》 石润婷 -《隐蔽化、多维化、开放化──论当今信息学竞赛中数学建模的灵活性》 杨 帆 -《准确性、全面性、美观性——测试数据设计中的三要素》 周咏基 -《论随机化算法的原理与设计》 ## 2000 陈 彧 《信息学竞赛中的思维方法》 方 奇 《动态规划》 高寒蕊 -《递推关系的建立及在信息学竞赛中的应用》 郭 一 -《数学模型及其在信息学竞赛中的应用》 江 鹏 -《探索构造法解题模式》 李 刚 -《动态规划的深入讨论》 龙 翀 -《解决空间规模问题的几种常用的存储结构》 骆 骥 -《数学模型的建立和选择》 施 遥 -《人工智能在围棋程序中的应用》 肖 洲 -《数据结构的在程序设计中的应用》 谢 婧 -《规模化问题的解题策略》 徐 串 -《论程序的调试技巧》 徐 静 -《图论模型的建立与转化》 杨江明 -《论数学策略在信息学问题中的应用》 杨 培 -《非最优化算法初探》 张 辰 -《动态规划的特点及其应用》 张 力 -《类比思想在解题中的应用》 张一飞 -《冗繁削尽留清瘦——浅谈信息的充分利用》 ## 2001 高寒蕊 -《从圆桌问题谈数据结构的综合运用》 符文杰 -《Pólya原理及其应用》 高 岳 -《中等硬度解题报告》 江 鹏 -《从一道题目的解法试谈网络流的构造与算法》 刘汝佳 -《搬运工问题的启示》 李益明 -《计算几何的相关问题》 李 源 -《树的枚举》 骆 骥 -《由"汽车问题"浅谈深度搜索的一个方面——搜索对象与策略的重要性》 毛子青 -《动态规划算法的优化技巧》 俞 玮 -《基本动态规划问题的扩展》 张一飞 -《求N!的高精度算法》 ## 2002 戴德承 -《退一步海阔天空——"目标转化思想"的若干应用》 方 奇 -《浅谈必要条件的应用》 符文杰 -《排序网络》 何江舟 -《用高斯消元法解线性方程组》 何 林 -《猜想及其应用》 黄 芸 -《POI0110 跳舞蝇》 金 恺 -《浅谈网络流算法的应用》 李澎煦 -《半平面交的算法及其应用》 李 睿 -《二分法与统计问题》 骆 骥 -《浅析解 "对策问题" 的两种思路——从《取石子》问题谈起》 孙方成 -《偶图的算法及应用》 孙林春 -《让我们做得更好——从《Parity》的解法谈程序的优化》 王知昆 -《搜索顺序的选择》 许智磊 -《二分,再二分!――从Mobiles(IOI 2001)一题看多重二分》 杨旻旻 -《构造法——解题的最短路径》 张家琳 -《多项式乘法》 张 宁 -《遗传算法的特点及其应用》 张一飞 -《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 周文超 -《树结构在程序设计中的运用》 ## 2003 方 奇 -《染色法和构造法在棋盘上的应用》 高正宇 -《答案只有一个——浅谈问答式交互问题》 何 林 -《一类称球问题的解法》 侯启明 -《信息论在信息学竞赛中的简单应用》 姜尚仆 -《模线性方程的应用——用数论方法解决整数问题》 金 恺 -《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》 雷环中 -《结果提交类问题》 林希德 -《求最大重复子串》 刘才良 -《平面图在信息学中的应用》 刘一鸣 -《一类搜索的优化思想——数据有序化》 陆可昱 -《长方体体积并》 饶向荣 -《病毒的DNA——剖析一道字符匹配问题解析过程》 邵烜程 -《数学思想助你一臂之力》 王知昆 -《浅谈用极大化思想解决最大子矩形问题》 伍 昱 -《由对称性解2-SAT问题》 项荣璟 -《充分利用问题性质——例析动态规划的"个性化"优化》 许智磊 -《浅谈补集转化思想在统计问题中的应用》 张 宁 -《猜数问题的研究》 张云亮 -《论对算法的选择》 周 源 -《浅析"最小表示法"思想在字符串循环同构问题中的应用》 ## 2004 何 林 -《信息学中守恒法的应用》 胡伟栋 -《减少冗余与算法优化》 金 恺 -《极限法——解决几何最优化问题的捷径》 李锐喆 -《细节——不可忽视的要素》 鬲 融 -《浅谈特殊穷举思想的应用》 周 源 -《浅谈数形结合思想在信息学竞赛中的应用》 朱晨光 -《优化,再优化!》 肖 天 -《"分层图思想"及其在信息学竞赛中的应用》 汪 汀 -《最小生成树问题的拓展》 吴景岳 -《最小生成树算法及其应用》 栗 师 -《转化目标在解题中的应用》 薛 矛 -《解决动态统计问题的两把利刃》 黄源河 -《浅谈图论模型的建立与应用》 楼天城 -《匹配算法在搜索问题中的应用》 贝小辉 -《浅析树的划分问题》 林 涛 -《线段树的应用》 杨思雨 -《伸展树的基本操作与应用》 许智磊 -《后缀数组》 朱泽园 -《多串匹配算法及其启示》 韩文弢 -《论C++语言在信息学竞赛中的应用》 ## 2005 龙 凡 -《序的应用》 魏 冉 -《浅谈“跳跃表”的相关操作及其应用》 任 恺 -《图论的基本思想及方法》 杨 俊 -《二分策略在信息学竞赛中的应用》 张伟达 -《用改进算法的思想解决规模维数增大的问题》 黄 刚 -《数据结构的联合》 杨 弋 -《从“小H的小屋”的解法谈算法的优化》 朱晨光 -《浅析倍增思想在信息学竞赛中的应用》 李羽修 -《Hash函数的设计优化》 王 俊 -《浅析二分图匹配在信息学竞赛中的应用》 唐文斌 -《正难则——浅谈逆向思维在解题中的应用》 黄源河 -《左偏树的特点及其应用》 钱自强 -《遗传算法应用的分析与研究》 杨思雨 -《浅谈“黄金分割”和信息学的联系》 潘震皓 -《置换群快速幂运算研究与探讨》 胡伟栋 -《非完美算法在信息学竞赛中的应用》 何 林 -《数据关系的简化》 汪 汀 -《参数搜索的应用》 周 源 -《浅谈信息学竞赛中的“压缩法”》 朱泽园 -《回到起点 ----《一种突破性思维》 ## 2006 陈启峰 -《“约制、放宽”方法在解题中的应用》 陈首元 -《维护森林连通性——动态树》 冯 威 -《数与图的完美结合——浅析差分约束系统》 高逸涵 -《对于一道题目的深入分析》 胡伟栋 -《演讲的若干建议》 黄劲松 -《贪婪的动态规划》 黄晓愉 -《深度优先搜索问题的优化技巧》 贾 由 -《由图论算法浅析算法优化》 李天翼 -《从特殊情况考虑》 龙 凡 -《一类猜数问题的研究》 汤 泽 -《浅析队列在一类单调性问题中的应用》 唐文斌 -《“调整”思想在信息学中的应用》 汪 晔 -《信息学中的参考系与坐标系》 王 栋 -《浅析平面Voronoi图的构造及应用》 王 赟 -《Trie图的构建、活用与改进》 余远铭 -《最短路算法及其应用》 俞 鑫 -《棋盘中的棋盘——浅谈棋盘的分割思想》 周戈林 -《浅谈类比思想》 周以苏 -《论汇编在时间常数优化中的应用》 朱晨光 -《基本数据结构在信息学竞赛中的应用》 朱泽园 -《半平面交的新算法及其实用价值》 ## 2007 高逸涵 -《与圆有关的离散化》 王晓珂 -《解析一类组合游戏》 仇荣琦 -《欧拉回路性质与应用探究》 余江伟 -《如何解决动态统计问题》 杨 沐 -《浅析信息学中的“分”与“合”》 李宇骞 -《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》 袁昕颢 -《动态树及其应用》 杨 哲 -《凸完全单调性的加强与应用》 王欣上 -《浅谈基于分层思想的网络流算法》 陈启峰 -《Size Balanced Tree》 杨 弋 -《Hash在信息学竞赛中的一类应用》 古 楠 -《平面嵌入》 郭华阳 -《RMQ与LCA问题》 刘雨辰 -《对拟阵的初步研究》 陈 雪 -《问题中的变与不变》 何 森 -《浅谈数据的合理组织》 胡伯涛 -《最小割模型在信息学竞赛中的应用》 陈瑜希 -《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 周 冬 -《生成树的计数及其应用》 刘家骅 -《浅谈随机化在信息学竞赛中的应用》 ## 2008 曹钦翔 -《数据结构的提炼与压缩》 郑 暾 -《平衡规划——浅析一类平衡思想的应用》 刘 弈 -《浅谈信息学中状态的合理设计与应用》 顾 研 -《浅谈随机化思想在几何问题中的应用》 周梦宇 -《码之道——浅谈信息学竞赛中的编码与译码问题》 肖汉骏 -《例谈信息学竞赛分析中的“深”与“广”》 方 戈 -《浅析信息学竞赛中一类与物理有关的问题》 吕子鉷 -《浅谈最短径路问题中的分层思想》 周小博 -《浅谈信息学竞赛中的区间问题》 俞华程 -《矩阵乘法在信息学中的应用》 程芃祺 -《计算几何中的二分思想》 高逸涵 -《部分贪心思想在信息学竞赛中的应用》 **陈丹琦 -《基于连通性状态压缩的动态规划问题》** 张煜承 -《一类算法复合的方法》 陈瑜希 -《Pólya计数法的应用》 余林韵 -《运用化归思想解决信息学中的数列问题》 任一恒 -《非完美算法初探》 高亦陶 -《从立体几何问题看降低编程复杂度》 **苏 煜 -《对块状链表的一点研究》** 周 冬 -《两极相通——浅析最大—最小定理在信息学竞赛中的应用》 ## 2009 武 森 -《浅谈信息学竞赛中的“0”和“1”》 **贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》** 徐持衡 -《浅谈几类背包题》 骆可强 -《论程序底层优化的一些方法与技巧》 刘 聪 -《浅谈数位类统计问题》 **李骥扬 -《线段跳表——跳表的一个拓展》** 汤可因 -《浅析竞赛中一类数学期望问题的解决方法》 徐源盛 -《对一类动态规划问题的研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问题中的应用》 罗穗骞 -《后缀数组——处理字符串的有力工具》 **方展鹏 -《浅谈如何解决不平等博弈问题》** 姜碧野 -《SPFA算法的优化及应用》 **毛杰明 -《母函数的性质及应用》** 董华星 -《浅析字母树在信息学竞赛中的应用》 梅诗珂 -《信息学竞赛中概率问题求解初探》 高逸涵 -《数位计数问题解法研究》 周而进 -《浅谈估价函数在信息学竞赛中的应用》 金 斌 -《欧几里得算法的应用》 曹钦翔 -《从“k倍动态减法游戏”出发探究一类组合游戏问题》 ## 2010~2012:组委会暂停论文答辩项目 ## 2013 彭天翼 -《登顶计划》 王康宁 -《方格取数》 罗 干 -《Two strings 试题讨论》 张闻涛 -《Catch The Penguins》 罗剑桥 -《浅谈分块思想在一类数据处理问题中的应用》 乔明达 -《搜索问题中的meet in the middle技巧》 胡渊鸣 -《浅析信息学竞赛中概率论的基础与应用》 许昊然 -《浅谈数据结构题的几个非经典解法》 陈立杰 -《重量平衡树和后缀平衡树在信息学奥赛中的应用》 高胜寒 -《浅谈环状计数问题》 王子昱 -《分块方法的应用》 王 迪 -《浅谈容斥原理》 ## 2014 王子昱 -《MSS 命题报告》 余行江 -《矩阵 命题报告》 董宏华 -《多变的多边形》 岑若虚 -《对置换群有关算法的初步研究》 匡正非 -《浅谈线性相关》 张恒捷 -《关于三维最小乘积生成树的一些研究》 徐 毅 -《浅谈回文子串问题》 梁泽宇 - 《浅谈维护多维数组的方法在数据结构题中的应用》 **王悦同 -《根号算法——不只是分块》** **黄志翱 -《浅谈动态树的相关问题及简单拓展》** **胡泽聪 -《随机化算法在信息学竞赛中的应用》** **何 琦 -《精细地实现程序——浅谈OI竞赛中的常数优化》** **沈 洋 -《回归本源——位运算及其应用》** **俞鼎力 -《寻找第 k 优解的几种方法》** ## 2015 刘研绎 -《后缀自动机在字典树上的拓展》 **任之洲 -《浅谈启发式思想在信息学竞赛中的应用》** 王鉴浩 -《浅谈字符串匹配的几种方法》 张天扬 -《后缀自动机及其应用》 金 策 -《生成函数的运算与组合计数问题》 刘剑成 -《YDC的奖金命题报告》 邹逍遥 -《浅谈分块在一类在线问题中的应用》 王逸松 -《仙人掌相关算法及其应用》 陈胤伯 -《浅谈图的匹配算法及其应用》 陈思禹 -《浅谈信息学竞赛中的物理问题》 于纪平 -《丢失的题面命题报告》 张恒捷 -《DP的一些优化技巧》 杜瑜皓 -《Product命题报告》 卢啸尘 -《关于以源代码为输入的一类问题的初步探索》 吕凯风 -《集合幂级数的性质与应用及其快速算法》 ## 2016 **任之洲 -《积性函数求和的几种方法》** **姜志豪 -《网络流的一些建模方法》** 董克凡 -《浅谈线性规划与对偶问题》 王文涛 -《浅谈无向图最小割问题的一些算法及应用》 邹逍遥 -《浅谈线性规划在信息学竞赛中的应用》 **吉如一 -《区间最值操作与历史最值问题》** **毛 啸 -《再探快速傅里叶变换》** **罗哲正 -《从Unknown谈一类支持末尾插入删除的区间信息维护方法》** 洪华敦 -《小C的后缀数组命题报告》 张浩威 -《消消看 命题报告》 李子豪 -《《strakf》命题报告》 汪文潇 -《《过去的集合》命题报告》 **吴作凡 -《火车司机出秦川 命题报告》** 金 策 -《基础排序算法练习题》 袁宇韬 -《move命题报告》 ## 2017 毛 啸 -《关于数列递归式的一些研究》 **杨家齐 -《基于线性代数的一般图匹配》** 袁宇韬 -《多项式求和》 **钟知闲 -《浅谈信息学竞赛中的独立集问题》** 陈俊锟 -《“神奇的子图”命题报告及其拓展》 孙耀峰 -《动态传递闭包问题的探究》 汪乐平 -《“A+B Problem”命题报告》 **徐明宽 -《非常规大小分块算法初探》** 翁文涛 -《回文树及其应用》 闫书弈 -《“黑白树”命题报告》 杨景钦 -《“正多边形”命题报告》 冯 哲 -《浅谈决策单调性动态规划的线性解法》 沈 睿 -《“被操纵的线段树”命题报告》 赵晟宇 -《计算机逻辑与艺术初探——基于逻辑的钢琴演奏音符力度模型》 洪华敦 -《“基因组重构”命题报告》 ## 2018 杨懋龙 - 《浅谈生成函数在掷骰子问题上的应用》 陈江伦 - 《“后缀树结点数”命题报告及一类区间问题的优化》 高睿泉 - 《浅谈保序回归问题》 吴瑾昭 - 《“Fim 4”命题报告》 任轩笛 - 《解决树上连通块问题的一些技巧和工具》 梁晏成 - 《“Jellyfish”命题报告及拓展探究》 王思齐 - 《LeafyTree及其实现的加权平衡树》 陈嘉乐 - 《“小H爱染色”命题报告》 朱震霆 - 《一些特殊的数论函数求和问题》 刘承奥 - 《浅谈DFT在信息学竞赛中的应用》 林旭恒 - 《“完美的队列”命题报告》 杨乾澜 - 《浅谈拟阵的一些拓展及其应用》 董炜隽 - 《浅谈Splay与Treap的性质及其应用》 何中天 - 《“最小方差生成树”命题报告》 陈 通 - 《欧拉图相关的生成与计数问题探究》 ## 2019 钟子谦 - 《两类递推数列的性质和应用》 王修涵 - 《浅谈图模型上的随机游走问题》 杨骏昭 - 《“小水题”命题报告》 高嘉煊 - 《浅谈图的点着色问题》 戴 言 - 《浅谈格路计数相关问题》 李佳衡 - 《算法竞赛中一些数论问题的推广与高斯整数初探》 范致远 - 《“基础圆方树练习题”命题报告》 徐翊轩 - 《“整点计数”命题报告以及对高斯整数的若干研究》 张哲宇 - 《浅谈树上分治算法》 吴思扬 - 《“组合数求和”命题报告》 王思齐 - 《浅谈一类简洁数据结构》 陈孙立 - 《子串周期查询问题的相关算法及其应用》 吴作同 - 《“公园”命题报告》 孔朝哲 - 《浅谈可追溯化数据结构》 袁方舟 - 《浅谈杨氏矩阵在信息学竞赛中的应用》 ## 推荐文章 许智磊 -《后缀数组》 罗穗骞 -《后缀数组——处理字符串的有力工具》 朱泽园 -《半平面交的新算法及其实用价值》 胡伯涛 -《最小割模型在信息学竞赛中的应用》 方展鹏 -《浅谈如何解决不平等博弈问题》 陈丹琦 -《基于连通性状态压缩的动态规划问题》 贾志豪 -《组合游戏略述——浅谈SG游戏的若干拓展及变形》 武 森 -《浅谈信息学竞赛中的“0”和“1”》 李骥扬 -《线段跳表——跳表的一个拓展》 周 源 -《浅析"最小表示法"思想在字符串循环同构问题中的应用》 高逸涵 -《数位计数问题解法研究》 张昆玮 -《数学归纳法与解题之道》 漆子超 -《分治算法在树的路径问题中的应用》 俞华程 -《矩阵乘法在信息学中的应用》 陈瑜希 -《Pólya计数法的应用》 # 论文分类汇总(1999-2009) ## 组合数学 ### 计数与统计 2001 - 符文杰:《Pólya原理及其应用》 2003 - 许智磊:《浅谈补集转化思想在统计问题中的应用》 2007 - 周冬:《生成树的计数及其应用》 2008 - 陈瑜希《Pólya计数法的应用》 ### 数位问题 2009 - 高逸涵《数位计数问题解法研究》 2009 - 刘聪《浅谈数位类统计问题》 ### 动态统计 2004 - 薛矛:《解决动态统计问题的两把利刃》 2007 - 余江伟:《如何解决动态统计问题》 ### 博弈 2002 - 张一飞:《由感性认识到理性认识——透析一类搏弈游戏的解答过程》 2007 - 王晓珂:《解析一类组合游戏》 2009 - 曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》 2009 - 方展鹏《浅谈如何解决不平等博弈问题》 2009 - 贾志豪《组合游戏略述——浅谈SG游戏的若干拓展及变形》 ### 母函数 2009 - 毛杰明《母函数的性质及应用》 ### 拟阵 2007 - 刘雨辰:《对拟阵的初步研究》 ### 线性规划 2007 - 李宇骞:《浅谈信息学竞赛中的线性规划——简洁高效的单纯形法实现与应用》 ### 置换群 2005 - 潘震皓:《置换群快速幂运算研究与探讨》 ### 问答交互 2003 - 高正宇:《答案只有一个——浅谈问答式交互问题》 ### 猜数问题 2003 - 张宁:《猜数问题的研究:一题的推广》 2006 - 龙凡:《一类猜数问题的研究》 ## 数据结构 ### 数据结构 2005 - 何林:《数据关系的简化》 2006 - 朱晨光:《基本数据结构在信息学竞赛中的应用》 2007 - 何森:《浅谈数据的合理组织》 2008 - 曹钦翔《数据结构的提炼与压缩》 ### 结构联合 2001 - 高寒蕊:《从圆桌问题谈数据结构的综合运用》 2005 - 黄刚:《数据结构的联合》 ### 块状链表 2005 - 蒋炎岩:《数据结构的联合——块状链表》 2008 - 苏煜《对块状链表的一点研究》 ### 动态树 2006 - 陈首元:《维护森林连通性——动态树》 2007 - 袁昕颢:《动态树及其应用》 ### 左偏树 2005 - 黄源河:《左偏树的特点及其应用》 ### 跳表 2005 - 魏冉:《让算法的效率“跳起来”!——浅谈“跳跃表”的相关操作及其应用》 2009 - 李骥扬《线段跳表——跳表的一个拓展》 ### SBT 2007 - 陈启峰:《Size Balance Tree》 ### 线段树 2004 - 林涛:《线段树的应用》 ### 单调队列 2006 - 汤泽:《浅析队列在一类单调性问题中的应用》 ### 哈希表 2005 - 李羽修:《Hash函数的设计优化》 2007 - 杨弋:《Hash在信息学竞赛中的一类应用》 ### Splay 2004 - 杨思雨:《伸展树的基本操作与应用》 ## 图论 ### 图论 2005 - 任恺:《图论的基本思想及方法》 ### 模型建立 2004 - 黄源河:《浅谈图论模型的建立与应用》 2004 - 肖天:《“分层图思想”及其在信息学竞赛中的应用》 ### 网络流 2001 - 江鹏:《从一道题目的解法试谈网络流的构造与算法》 2002 - 金恺:《浅谈网络流算法的应用》 2007 - 胡伯涛:《最小割模型在信息学竞赛中的应用》 2007 - 王欣上:《浅谈基于分层思想的网络流算法》 2008 - 周冬《两极相通——浅析最大—最小定理在信息学竞赛中的应用》 ### 最短路 2006 - 余远铭:《最短路算法及其应用》 2008 - 吕子鉷《浅谈最短径路问题中的分层思想》 2009 - 姜碧野《SPFA算法的优化及应用》 ### 欧拉路 2007 - 仇荣琦:《欧拉回路性质与应用探究》 ### 差分约束系统 2006 - 冯威:《数与图的完美结合——浅析差分约束系统》 ### 平面图 2003 - 刘才良:《平面图在信息学中的应用》 2007 - 古楠:《平面嵌入》 ### 2-SAT 2003 - 伍昱:《由对称性解2-SAT问题》 ### 最小生成树 2004 - 吴景岳:《最小生成树算法及其应用》 2004 - 汪汀:《最小生成树问题的拓展》 ### 二分图 2005 - 王俊:《浅析二分图匹配在信息学竞赛中的应用》 ### Voronoi图 2006 - 王栋:《浅析平面Voronoi图的构造及应用》 ### 偶图 2002 - 孙方成:《偶图的算法及应用》 ## 树 ### 树 2002 - 周文超:《树结构在程序设计中的运用》 2005 - 栗师:《树的乐园——一些与树有关的题目》 ### 路径问题 2009 - 漆子超《分治算法在树的路径问题中的应用》 ### 最近公共祖先 2007 - 郭华阳:《RMQ与LCA问题》 ### 划分问题 2004 - 贝小辉:《浅析树的划分问题》 ## 数论 ### 欧几里得算法 2009 - 金斌《欧几里得算法的应用》 ### 同余方程 2003 - 姜尚仆:《模线性方程的应用——用数论方法解决整数问题》 ## 搜索 ### 搜索 2001 - 骆骥:《由“汽车问题”浅谈深度搜索的一个方面——搜索对象与策略的重要性》 2002 - 王知昆:《搜索顺序的选择》 2005 - 汪汀:《参数搜索的应用》 ### 启发式 2009 - 周而进《浅谈估价函数在信息学竞赛中的应用》 ### 优化 2003 - 金恺:《探寻深度优先搜索中的优化技巧——从正方形剖分问题谈起》 2003 - 刘一鸣:《一类搜索的优化思想——数据有序化》 2006 - 黄晓愉:《深度优先搜索问题的优化技巧》 ## 背包问题 2009 - 徐持衡《浅谈几类背包题》 ## 匹配 2004 - 楼天城:《匹配算法在搜索问题中的巧用》 ## 概率 ### 概率 2009 - 梅诗珂《信息学竞赛中概率问题求解初探》 ### 数学期望 2009 - 汤可因《浅析竞赛中一类数学期望问题的解决方法》 ## 字符串 ### 字符串 2003 - 周源:《浅析“最小表示法”思想在字符串循环同构问题中的应用》 ### 多串匹配 2004 - 朱泽园:《多串匹配算法及其启示》 2006 - 王赟:《Trie图的构建、活用与改进》 2009 - 董华星《浅析字母树在信息学竞赛中的应用》 ### 后缀数组 2004 - 许智磊:《后缀数组》 2009 - 罗穗骞《后缀数组——处理字符串的有力工具》 ### 字符串匹配 2003 - 饶向荣:《病毒的DNA———剖析一道字符匹配问题解析过程》 2003 - 林希德:《求最大重复子串》 ## 动态规划 ### 动态规划 2001 - 俞玮:《基本动态规划问题的扩展》 2006 - 黄劲松:《贪婪的动态规划》 2009 - 徐源盛《对一类动态规划问题的研究》 ### 状态压缩 2008 - 陈丹琦《基于连通性状态压缩的动态规划问题》 ### 状态设计 2008 - 刘弈《浅谈信息学中状态的合理设计与应用》 ### 树形DP 2007 - 陈瑜希:《多角度思考创造性思维——运用树型动态规划解题的思路和方法探析》 ### 优化 2001 - 毛子青:《动态规划算法的优化技巧》 2003 - 项荣璟:《充分利用问题性质——例析动态规划的“个性化”优化》 2004 - 朱晨光:《优化,再优化!——从《鹰蛋》一题浅析对动态规划算法的优化》 2007 - 杨哲:《凸完全单调性的加强与应用》 ## 计算几何 ### 立体几何 2003 - 陆可昱:《长方体体积并》 2008 - 高亦陶《从立体几何问题看降低编程复杂度》 ### 计算几何思想 2004 - 金恺:《极限法——解决几何最优化问题的捷径》 2008 - 程芃祺《计算几何中的二分思想》 2008 - 顾研《浅谈随机化思想在几何问题中的应用》 ### 圆 2007 - 高逸涵:《与圆有关的离散化》 ### 半平面交 2002 - 李澎煦:《半平面交的算法及其应用》 2006 - 朱泽园:《半平面交的新算法及其实用价值》 ## 矩阵 ### 矩阵 2008 - 俞华程《矩阵乘法在信息学中的应用》 ### 高斯消元 2002 - 何江舟:《用高斯消元法解线性方程组》 ## 数学方法 ### 数学思想 2002 - 何林:《猜想及其应用》 2003 - 邵烜程:《数学思想助你一臂之力》 ### 数学归纳法 2009 - 张昆玮《数学归纳法与解题之道》 ### 多项式 2002 - 张家琳:《多项式乘法》 ### 数形结合 2004 - 周源:《浅谈数形结合思想在信息学竞赛中的应用》 ### 黄金分割 2005 - 杨思雨:《美,无处不在——浅谈“黄金分割”和信息学的联系》 ## 其他算法 ### 遗传算法 2002 - 张宁:《遗传算法的特点及其应用》 2005 - 钱自强:《关于遗传算法应用的分析与研究》 ### 信息论 2003 - 侯启明:《信息论在信息学竞赛中的简单应用》 ### 染色与构造 2002 - 杨旻旻:《构造法——解题的最短路径》 2003 - 方奇:《染色法和构造法在棋盘上的应用》 ## 一类问题 ### 区间 2008 - 周小博《浅谈信息学竞赛中的区间问题》 ### 序 2005 - 龙凡:《序的应用》 ### 系 2006 - 汪晔:《信息学中的参考系与坐标系》 ### 物理问题 2008 - 方戈《浅析信息学竞赛中一类与物理有关的问题》 ### 编码与译码 2008 - 周梦宇《码之道—浅谈信息学竞赛中的编码与译码问题》 ### 对策问题 2002 - 骆骥:《浅析解“对策问题”的两种思路》 ## 优化 ### 算法优化 2002 - 孙林春:《让我们做得更好——从解法谈程序优化》 2004 - 胡伟栋:《减少冗余与算法优化》 2005 - 杨弋:《从的解法谈算法的优化》 2006 - 贾由:《由图论算法浅析算法优化》 ### 程序优化 2006 - 周以苏:《论汇编在时间常数优化中的应用》 2009 - 骆可强《论程序底层优化的一些方法与技巧》 ### 语言 C++ 2004 - 韩文弢:《论C++语言在信息学竞赛中的应用》 ## 策略 ### 策略 2004 - 李锐喆:《细节——不可忽视的要素》 2005 - 朱泽园:《回到起点——一种突破性思维》 2006 - 陈启峰:《“约制、放宽”方法在解题中的应用》 2006 - 李天翼:《从特殊情况考虑》 2007 - 陈雪:《问题中的变与不变》 2008 - 肖汉骏《例谈信息学竞赛分析中的“深”与“广”》 ### 倍增 2005 - 朱晨光:《浅析倍增思想在信息学竞赛中的应用》 ### 二分 2002 - 李睿:《二分法与统计问题》 2002 - 许智磊:《二分,再二分!——从Mobiles(IOI2001)一题看多重二分》 2005 - 杨俊:《二分策略在信息学竞赛中的应用》 ### 调整 2006 - 唐文斌:《“调整”思想在信息学中的应用》 ### 随机化 2007 - 刘家骅:《浅谈随机化在信息学竞赛中的应用》 ### 非完美算法 2005 - 胡伟栋:《浅析非完美算法在信息学竞赛中的应用》 2008 - 任一恒《非完美算法初探》 ### 提交答案题 2003 - 雷环中:《结果提交类问题》 ### 守恒思想 2004 - 何林:《信息学中守恒法的应用》 ### 极限法 2003 - 王知昆:《浅谈用极大化思想解决最大子矩形问题》 ### 贪心 2008 - 高逸涵《部分贪心思想在信息学竞赛中的应用》 ### 压缩法 2005 - 周源:《压去冗余缩得精华——浅谈信息学竞赛中的“压缩法”》 ### 逆向思维 2005 - 唐文斌:《正难则——浅谈逆向思维在解题中的应用》 ### 穷举 2004 - 鬲融:《浅谈特殊穷举思想的应用》 ### 目标转换 2002 - 戴德承:《退一步海阔天空——“目标转化思想”的若干应用》 2004 - 栗师:《转化目标在解题中的应用》 ### 类比 2006 - 周戈林:《浅谈类比思想》 ### 分割与合并 2006 - 俞鑫:《棋盘中的棋盘——浅谈棋盘的分割思想》 2007 - 杨沐:《浅析信息学中的“分”与“合”》 ### 平衡思想 2008 - 郑暾《平衡规划——浅析一类平衡思想的应用》
光盘: ├─chap01....................................第1章 PE文件格式的深入分析 │ └─PEDump.zip ;Matt Pietrek的PEDUMP程序 │ ├─chap02....................................第2章 PE分析工具编写 │ ├─PEInfo_example ;PE分析工具样例 │ └─Test ;TestSH.exe,这个程序的OptionalHeader的大小为0xD0 │ ├─chap03....................................第3章 Win32 调试API │ ├─内存补丁 │ │ ├─进程间内存共享机制应用.txt │ │ ├─使用Dr X调试寄存器框架程序.txt │ │ └─bpm example code ;yoda的实例,演示利用Ntdll.ntcontinue作为跳板在入口点处中断 │ └─脱壳机 │ ├─Unlock.asm ;脱壳机的源程序 │ ├─unlock.exe ;己编译好的脱壳机程序 │ └─locked.exe ;被tElock 0.98保护的记事本程序 │ ├─chap04....................................第4章 Windows下的异常处理 │ ├─sehRelease │ │ ├─sehdef.inc ;完整的异常代码列表 │ │ ├─s1.asm ;例子1.演示Final型异常处理及参数获取 │ │ ├─s2.asm ;例子2.演示Per_Thread型异常处理 │ │ ├─s3.asm ;例子3.演示Per_Thread型异常处理的嵌套处理 │ │ └─S4.ASM ;例子4.演示异常处理的堆栈展开 │ ├─ring ;例子5.演示Windows9x进特权级Ring0 │ ├─singlestep ;例子6.演示SEH实现单步自跟踪 │ └─veh ;例子7.VEH代码演示 │ ├─chap05....................................第5章 跟踪技术 │ ├─Anti-Debug ;5.1 调试技术 │ │ ├─MeltICE ;句柄检测 │ │ ├─Back Door ;SoftICE后门指令 │ │ ├─int 68 ;int68子类型 │ │ ├─ICECream ;ICECream子类型 │ │ ├─NticeService ;判断NTICE服务是否运行 │ │ ├─int1 ;INT 1 检测 │ │ ├─UnhandledExceptionFilter ;利用UnhandledExceptionFilter检测 │ │ └─int41 ;INT 41子类型 │ ├─DetectBreakpoint ;5.2 断点检测技术 │ │ ├─SEHbpx ;利用SEH防范BPX断点 │ │ ├─SEHbpm ;利用SEH防范BPM断点 │ │ └─IsBPX ;检测函数首地址 │ ├─Anti-Loader ;5.3 加载技术 │ │ ├─TEB ;利用TEB检测 │ │ ├─IsDebuggerPresent ;利用IsDebuggerPresent函数检测 │ │ └─CheckParentProc ;检查父进程 │ ├─Anti-Monitor ;5.4 监视技术 │ │ ├─AntiProcDump ;窗口方法检测ProcDump │ │ └─Anti-Filemon&Regmon ;句柄检测Filemon和Regmon │ ├─Anti-Disassemble ;5.5 静态分析技术 │ │ ├─pushre ;扰乱汇编代码 │ │ ├─SMC ;SMC技术实现 │ │ └─花指令 ;花指令样例 │ ├─CRC ;5.7 文件完整性校验 │ │ ├─磁盘文件校验 │ │ │ ├─add2crc32 ;计算文件CRC32的工具,可以将结果写进文件里 │ │ │ └─crc32 ;待校验的程序 │ │ ├─内存映像校验 │ │ │ ├─memcrc32 │ │ │ │ └─src │ │ │ │ ├─add2memcrc32 ;计算PE文件代码区块CRC32的工具,可以将结果写进文件里 │ │ │ │ └─memcrc32 ;需要校验内存代码数据的程序 │ │ │ └─Detect Breakpoint ;校验内存中的片段代码的样例 │ │ └─CRC原理 ;arbin翻译的《CRC原理及其逆向分析方法》 │ └─codeEncrypt ;5.8 代码与数据结合技术 │ ├─codeEncrypt ;代码与数据结合的实例 │ └─tools ;Encrypter.exe工具及其源码 │ ├─Chap06....................................第6章 加壳软件编写 │ ├─prot ;本章实例加壳工具prot v0.46及其源码 │ ├─aPLib引擎 ;aPLib压缩引擎 │ └─TestUseVC ;Spring的加壳程序综合运用的实例 │ ├─Chap07....................................第7章 如何让壳与程序融为一体 │ ├─7.1 欺骗检查壳的工具 │ │ ├─aspack212压缩 │ │ ├─aspack212压缩后更改入口代码 │ │ ├─aspack压缩后再修改过的壳加壳 │ │ ├─aspack压缩后再自己加壳 │ │ ├─实例(没加壳) │ │ ├─自己加的壳 │ │ ├─自己的加壳工具 │ │ │ ├─原版壳的程序 │ │ │ └─更改后的壳的程序程序 │ │ └─tools │ │ ├─fi ;测试用的FileInfo工具 │ │ └─aspack212 ;测试用的Aspack加壳工具 │ ├─7.2判断自己是否给脱壳 │ │ ├─7.2.1 判断文件尺寸 │ │ ├─7.2.4 使用存储映像文件检查标记 │ │ ├─7.2.2 使用同步对象检查标记 │ │ ├─7.2.3 使用原子(ATOM)检查标记 │ │ ├─7.2.5 使用线程优先权检查标记 │ │ ├─7.2.6 使用外部文件检查标记 │ │ └─7.2.8 注入一个定时器 │ └─7.3 使用SDK把程序和壳溶为一体 │ ├─test ;实例 │ └─sdk壳的程序 │ ├─chap08....................................第8章 Visual Basic 6 逆向工程 │ ├─example1 ;演示虚函数表的概念 │ ├─example2 ;如何处理事件的虚函数表 │ ├─example3 ;利用SEH加载 │ ├─example4 ;演示如何更改程序结构 │ ├─example5 ;本例简单说明了如何直接修改vb6程序的控件属性值 │ ├─example6 ;一个VB6 P-code Crackme分析实例 │ └─example7 ;VB“自锁”功能实现的实例 │ ├─附录A.....................................附录A 在Visual C++中使用内联汇编 │ ├─InlineASM ;内联汇编实例 │ └─SeparateASM ;VC 中调用 MASM 独立汇编实例 │ └─附录B.....................................附录B 在Visual Basic中使用汇编 ├─TweakVB ;TweakVB 控件(http://www.tweakvb.com/) ├─VBInlineAsm ;VBInlineAsm控件 └─Compile Controller ;Compile Controller控件 ;(http://www.fawcette.com/archives/premier/mgznarch/vbpj/1999/11nov99/jc1199/jc1199.asp)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值