// File: JameyWoo[P]re2graph/algorithms.cpp
// Function: get_closure(NFA, std::vector<std::set<int, std::less<int>, std::allocator<int>>, std::allocator<std::set<int, std::less<int>, std::allocator<int>>>>&, int, std::vector<bool, std::allocator<bool>>&)
void get_closure(NFA nfa, vector<set<int>> &closures, int state, vector<bool> &visted) {
    /**
     * ! 获取nfa某状态闭包的函数. 存储在closures中
     * !  参数解释: 
     * NFA nfa: 要求闭包的nfa
     * vector<set<int>> &closures: 闭包存储的数据结构
     * int state: 当前要求闭包的状态. 由于dfa, 先求出它可以扩展的状态, 再回来求它
     * vector<bool> &visted: 回溯的标记, 先标记为true, 回溯之后标记为false
     */
    if (closures[state].size()) return;
    for (auto x : nfa.jump[state]) {                                                 // 当前状态的map集
        if (x.first == '~') {                                                        // 当边为 空 时, 可以滑动求闭包
            for (auto y : x.second) {                                                // 遍历下一状态
                if (visted[y] == false) {                                            // 当前递归路径没有被访问过
                    visted[y] = true;                                                // 标记访问
                    get_closure(nfa, closures, y, visted);                           // 递归得到下一状态闭包
                    closures[state].insert(closures[y].begin(), closures[y].end());  // 更新当前状态闭包
                    visted[y] = false;                                               // 撤销标记
                }
            }
        }
    }
    closures[state].insert(state);  // ! ...插入自己......
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x190, %rsp            # imm = 0x190
movq %rdi, -0x150(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x10(%rbp), %rdi
movslq -0x14(%rbp), %rsi
callq 0x12720
movq %rax, %rdi
callq 0x12740
cmpq $0x0, %rax
je 0xc1e1
jmp 0xc4a8
movq -0x150(%rbp), %rdi
addq $0x58, %rdi
movslq -0x14(%rbp), %rsi
callq 0x121f0
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
callq 0x12850
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rdi
callq 0x12880
movq %rax, -0x38(%rbp)
leaq -0x30(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x128b0
testb $0x1, %al
jne 0xc229
jmp 0xc482
leaq -0x30(%rbp), %rdi
callq 0x128e0
movq %rax, %rsi
leaq -0x58(%rbp), %rdi
callq 0x6ce0
movsbl -0x58(%rbp), %eax
cmpl $0x7e, %eax
jne 0xc460
leaq -0x58(%rbp), %rax
addq $0x8, %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rdi
callq 0x12900
movq %rax, -0x68(%rbp)
movq -0x60(%rbp), %rdi
callq 0x12930
movq %rax, -0x70(%rbp)
leaq -0x68(%rbp), %rdi
leaq -0x70(%rbp), %rsi
callq 0x12960
testb $0x1, %al
jne 0xc287
jmp 0xc45e
leaq -0x68(%rbp), %rdi
callq 0x129a0
movl (%rax), %eax
movl %eax, -0x74(%rbp)
movq -0x20(%rbp), %rdi
movslq -0x74(%rbp), %rsi
callq 0x12760
movq %rdx, -0x160(%rbp)
movq %rax, -0x158(%rbp)
jmp 0xc2b2
movq -0x160(%rbp), %rax
movq -0x158(%rbp), %rcx
movq %rcx, -0x88(%rbp)
movq %rax, -0x80(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x14a80
andb $0x1, %al
movzbl %al, %eax
cmpl $0x0, %eax
jne 0xc44e
movq -0x20(%rbp), %rdi
movslq -0x74(%rbp), %rsi
callq 0x12760
movq %rdx, -0x170(%rbp)
movq %rax, -0x168(%rbp)
jmp 0xc302
movq -0x170(%rbp), %rax
movq -0x168(%rbp), %rcx
movq %rcx, -0xa8(%rbp)
movq %rax, -0xa0(%rbp)
leaq -0xa8(%rbp), %rdi
movl $0x1, %esi
callq 0x127c0
movq -0x150(%rbp), %rsi
leaq -0x118(%rbp), %rdi
callq 0x47a0
jmp 0xc344
movq -0x10(%rbp), %rsi
movl -0x74(%rbp), %edx
movq -0x20(%rbp), %rcx
leaq -0x118(%rbp), %rdi
callq 0xc1a0
jmp 0xc35d
leaq -0x118(%rbp), %rdi
callq 0x4880
movq -0x10(%rbp), %rdi
movslq -0x14(%rbp), %rsi
callq 0x12720
movq %rax, -0x178(%rbp)
movq -0x10(%rbp), %rdi
movslq -0x74(%rbp), %rsi
callq 0x12720
movq %rax, %rdi
callq 0x12c80
movq %rax, -0x120(%rbp)
movq -0x10(%rbp), %rdi
movslq -0x74(%rbp), %rsi
callq 0x12720
movq %rax, %rdi
callq 0x12cb0
movq -0x178(%rbp), %rdi
movq %rax, -0x128(%rbp)
movq -0x120(%rbp), %rsi
movq -0x128(%rbp), %rdx
callq 0x12c40
jmp 0xc3d1
movq -0x20(%rbp), %rdi
movslq -0x74(%rbp), %rsi
callq 0x12760
movq %rdx, -0x188(%rbp)
movq %rax, -0x180(%rbp)
jmp 0xc3ee
movq -0x188(%rbp), %rax
movq -0x180(%rbp), %rcx
movq %rcx, -0x138(%rbp)
movq %rax, -0x130(%rbp)
leaq -0x138(%rbp), %rdi
xorl %esi, %esi
callq 0x127c0
jmp 0xc44e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
jmp 0xc477
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0x118(%rbp), %rdi
callq 0x4880
jmp 0xc477
jmp 0xc450
leaq -0x68(%rbp), %rdi
callq 0x12aa0
jmp 0xc271
jmp 0xc460
leaq -0x58(%rbp), %rdi
callq 0x6e80
leaq -0x30(%rbp), %rdi
callq 0x12ac0
jmp 0xc213
leaq -0x58(%rbp), %rdi
callq 0x6e80
jmp 0xc4b1
movq -0x10(%rbp), %rdi
movslq -0x14(%rbp), %rsi
callq 0x12720
movq %rax, %rdi
leaq -0x14(%rbp), %rsi
callq 0x12d00
movq %rax, -0x148(%rbp)
movb %dl, -0x140(%rbp)
addq $0x190, %rsp            # imm = 0x190
popq %rbp
retq
movq -0x90(%rbp), %rdi
callq 0x34e0
nopl (%rax)