Other

Leetcode 5 Longest Palindromic Substring DP

Given a string s, return the longest palindromic substring in s. Solution 设 \(dp[i][j]\) 表示字串 \(s[i,...,j]\) 是否为回文串。初始化时,每个单独的字符本身就是回文串;长度为2的串只要首尾相同,也是回文串;长度 \(\geq 3\) 时,只有满足: \[dp[i+1][j-1]\ \&\&\ s[i]=s[j] \] 此时 \(dp[i][j]\) 也就是回文串。因此循环内侧的 \(i\) 时,应倒序遍历 点击查看代码 class Solution { private: bool dp[1003][1003]; int MAX = -1; int ansl, ansr; public: string longestPalindrome(string s) { int n = s.length(); for(int i=0;i<n;i++){ dp[i][i] = true; MAX = 1; ansl = i; } for(int j=1;j<n;j++){ for(int i=j-1;i>=0;i--){ if(i+1==j){ if(s[i]==s[j])dp[i][j] = true; else dp[i][j] = false; } else{ if(s[i]==s[j] && dp[i+1][j-1])dp[i][j] = true; else dp[i][j] = false; } if(dp[i][j]){ if(MAX<j-i+1)MAX = j-i+1, ansl = i, ansr = j; } } } return s.

Druid源码解析(五):DruidDataSource的shrink过程

shrink方法是DestroyTask线程中回收连接的具体执行方法。  首先获得锁: try { lock.lockInterruptibly(); } catch (InterruptedException e) { return; }  之后,要判断初始化状态是否完成,如果采用异步初始化,可能DestoryTask线程已经启动,但是连接池还没有初始化完成。 if (!inited) { return; }   之后对连接池中的连接进行遍历,connections中,可连接的连接数记在poolingCount变量。 此时要记录一个checkCount,这个变量为 checkCount = poolingCount - minIdle;也就是checkCount为连接池中连接的数量减去最小空闲连接数设置minIdle。  此后进入checkTime逻辑,checkTime是调用shrink传入的参数,通常DestroyTask的调用这个参数都为true。 此后check的参数有:  判断物理连接是否超时:phyConnectTimeMillis > phyTimeoutMillis。如果超时,则将当前连接标记到evictConnections数组并退出当前循环。  判断空闲时间是否超时: 如果空闲时间小于最小于配置的minEvictableIdleTimeMillis时间且同时小于配置的keepAliveBetweenTimeMillis(idleMillis < minEvictableIdleTimeMillis && idleMillis < keepAliveBetweenTimeMillis) 则结束循环。 反之,当idleMillis大于minEvictableIdleTimeMillis或者大于maxEvictableIdleTimeMillis都被标记到evictConnections数组。  判断keepAlive是否超时:如果idleMillis >= keepAliveBetweenTimeMillis,则标记到keepAliveConnections数组。  如果checkTime为false,则将小于checkCount的全部连接都标记到evictConnections数组。 if (i < checkCount) { evictConnections[evictCount++] = connection; } else { break; }  这之后进行removeCount的处理,removeCount = evictCount + keepAliveCount; 处理逻辑如下:

Codeforces SWERC 2021-2022 - Online Mirror 部分简要题解

A. Organizing SWERC 签到题 priority_queue<int> a[20]; int n; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int T;cin>>T; while (T--) { cin>>n; rep(i,1,n) { int x,y; cin>>x>>y; a[y].push(x); } int ans=0; rep(i,1,10) { if (a[i].empty()) { ans=-1; break; } else { int x=a[i].top(); ans+=x; } } if (ans<0) cout<<MOREPROBLEMS<<endl; else cout<<ans<<endl; rep(i,1,10) { while (!a[i].empty()) a[i].pop(); } } } B. Toys 咕 C. European Trip 记图的邻接矩阵为\(A\), 那么从\(i\)到\(j\)的长度为\(k\)的路径一共有\((A^k)_{ij}\)条, 所有起点和终点相同的路径数量为\(\mathrm{tr}(A^k)\). 考虑加上special trip的限制. 依然是考虑矩阵乘法, 假设路径长度为\(k\)时的矩阵为\(F_k\), 那么有转移式

二十三、死锁

死锁: 多个线程各自占有一些共享资源﹐并且互相等待其他线程占有的资源才能运行﹐而导致两个或者多个线程都在等待对方释放资源﹐都停止执行的情形﹒某一个同步块同时拥有“两个以上对象的锁”时,就可能会发生“死锁”的问题. 产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用。 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 循环等待条件∶若干进程之间形成一种头尾相接的循环等待资源关系。  鱼和熊掌不可兼得: public class DeadLock { public static void main(String[] args) { Get zs = new Get(0, 张三); Get ls = new Get(1, 李四); new Thread(zs).start(); new Thread(ls).start(); } } //鱼 class Fish{ } //熊掌 class BearPaws{ } //获得 class Get implements Runnable{ static Fish fish = new Fish(); static BearPaws bearPaws= new BearPaws(); int chice; String user; public Get(int chice, String user) { this.

二十四、锁(Lock)

从JDK5.0开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当 java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象 ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁。 public class ThreadLock implements Runnable{ private int ticket=10; private ReentrantLock lock = new ReentrantLock(); @Override public void run() { try { //加锁 lock.lock(); while (true){ if (ticket>0){ System.out.println(Thread.currentThread().getName()+买到的票号:+ticket--); }else{ break; } } } catch (Exception e) { throw new RuntimeException(e); } finally { //解锁 lock.unlock(); } } public static void main(String[] args) { ThreadLock t = new ThreadLock(); new Thread(t,张三).start(); new Thread(t,李四).start(); new Thread(t,王五).start(); } }  

NLP数据集共享、LDC语料

包括ACE2005、TACRED、WSJ0、Ontonotes5.0、NYT(New York Times)、Gigaword、Conll2003、CTB9.0、TDT5、HKUST、TIMIT、TAC KBP等LDC语料。 如有需要可加V:13072932758. ACE2005   TACRED   ontonotes-release-5.0   New York Times   WSJ0(LDC93S6A)

Educational Codeforces Round 128 (Rated for Div. 2) A-C+E

Educational Codeforces Round 128 (Rated for Div. 2) A-C+E A 题目 https://codeforces.com/contest/1680/problem/A 题解 思路 知识点:思维。 如果 \([l1,r1],[l2,r2]\) 有交集可以是相同的数字,那么取 \(min(l1,l2)\) ;如果 \([l1,r1],[l2,r2]\) 没有交集,说明最大值最小值不能是相同的数字,那么取 \(l1+l2\) 。 直接判断端点可能太多,可以利用 \(swap\) 考虑固定 \(l1<l2\) ,就剩下两种情况。 时间复杂度 \(O(1)\) 空间复杂度 \(O(1)\) 代码 #include <bits/stdc++.h> using namespace std; int main(){ std::ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int t; cin>>t; while(t--){ int l1,r1,l2,r2; cin>>l1>>r1>>l2>>r2; if(l2<l1){ swap(l1,l2); swap(r1,r2); } if(r1>=l2) cout<<l2<<'\n'; else cout<<l1+l2<<'\n'; } return 0; } B 题目 https://codeforces.com/contest/1680/problem/B 题解 思路 知识点:思维。 找到机器人中最靠左上的行列坐标(不一定要在同一个机器人身上),如此坐标表示了机器人阵列移动多少次就会出现爆炸。 如果这组行列坐标的位置没有机器人,说明移动到爆炸极限之前都没有机器人会到达左上角,因此不可行,否则可行。

存储器管理——内存管理的概念

操作系统负责的内存管理: 1.内存空间的分配与回收 2.从逻辑上扩充内存空间(游戏GTA的大小超过60GB,按理来说这个游戏程序运行之前需要把60GB数据全部放入内存。然而,实际我的电脑内存才4GB,但为什么这个游戏可以顺利运行呢?一虚拟技术(操作系统的虚拟性)) 3.地址转换功能,逻辑地址→物理地址。地址重定位:逻辑地址到物理地址的转换过程 4.内存保护功能,保证各进程在各自存储空同内运行,互不干扰 地址转换: 绝对装入:编译时产生绝对地址(单道程序阶段,此时还没产生操作系统) 可重定位装入:装入时将逻辑地址转换为物理地址(用于早期的多道批处作系统) 动态运行时装入:运行时将逻辑地址转为物理地址,需设置重定位寄存器(现代操作系统) 内存保护的两种方法: 方法一:在CPU中设置一对上、下限寄存器,存放进程的上、下限地址。进程的指令要访问某个地址时,CPU检查是否越界。 方法二:采用重定位寄存器(又称基址寄存器)和界地址寄存器(又称限长寄存器)进行越界检查。重定位寄存器中存放的是进程的起始物理地址。界地址寄存器中存放的是进程的最大逻辑地址。

配置并使用油猴(tampermonkey)脚本,超详细的教程!

​ 目录 一、什么是油猴(tampermonkey)? 1.介绍 2.油猴有哪些强大的功能? 二、如何为浏览器安装tampermonkey扩展 (若已安装可直接跳至步骤三) 1.打开浏览器的扩展界面 2.搜索 tampermonkey 并安装 3.如何判断tampermonkey是否安装成功? 三、如何安装或添加新脚本 1.如何安装用户上传的脚本 2.如何将本地的脚本文件配置至浏览器 3.如何判断脚本是否安装成功 四、常用脚本推荐 1.学习通网课 2.百度网盘全速下载 3.VIP视频免费观看 (腾讯视频、爱奇艺、优酷等) 4.文本选中复制 五、其他  一、什么是油猴(tampermonkey)? 1.介绍 「油猴」是浏览器的功能扩展,可以通过安装各类脚本对网站的功能进行升级。 2.油猴有哪些强大的功能? 直接下载百度网盘文件 (全速) 过滤百度搜索广告 文本选中复制 (百度文库、道客巴巴等) 刷学习通网课 VIP视频免费观看 (腾讯视频、爱奇艺、优酷等) 阅读全文、自动展开全文、自动移除万恶弹框 哔哩哔哩视频下载 ......  二、如何为浏览器安装tampermonkey扩展 (若已安装可直接跳至步骤三) 1.打开浏览器的扩展界面 (不同浏览器的功能栏略有不同,以Microsoft Edge、Firefox、Cent Browser浏览器为例) 打开设置界面,点击扩展按钮 ​ ​ ​ 2.搜索 tampermonkey 并安装 (以下操作以Win10自带的Microsoft Edge浏览器为例) 依次按如下顺序点击,完成对tampermonkey的安装 ​ ​  ​ 3.如何判断tampermonkey是否安装成功? 安装成功后浏览器上方会显示tampermonkey扩展,并可将其显示在工具栏  ​ ​ 三、如何安装或添加新脚本 1.如何安装用户上传的脚本 点击获取新脚本,并输入关键字进行搜索,安装想要安装的脚本