今日份精彩题
生活如戏,昨天那公司今天让我明天中午1:30第二轮面试…不想去了。
//补充一个小语法知识,Leecode不用输入,所以我连cin如何读入空格都不知道
string tmp;
getline(cin, tmp);
回归今日话题
583两个字符串的删除操作,第一感觉是编辑距离的阉割版,其实就是,编辑距离一直都是我很喜欢的一个dp题,放一下吧
class Solution {
public:
int minDistance(string word1, string word2) {
vector<vector<int>> dp(word1.size() + 2, vector<int>(word2.size() + 2, 0));
for(int i = 1; i <= word1.size(); i++){
dp[i][0] = i;
}
for(int j = 1; j <= word2.size(); j++){
dp[0][j] = j;
}
for(int i = 1; i <= word1.size(); i++){
for(int j = 1; j <= word2.size(); j++){
if(word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];
else dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + 1;
}
}
return dp[word1.size()][word2.size()];
}
};
专业知识
操作系统部分:
- Linux如何在获得shell的情况下添加用户,前天技术面小哥哥笑话我了,我只知道用鼠标点一点那种
useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户。
#建立一个新用户账户guest,并设置UID为555,主目录为/usr/guest,属于users组
#加-m 如果主目录不存在则自动创建
useradd -u 555 -d /usr/guest -g users -m guest
计算机网络部分:
- 第一次看这样解释TCP三次握手的,感觉很有道理:
- 保证双方都是双工通信
第一次握手,服务端确定客户端的发送正常
第二次握手,客户端确认服务端的收发正常
第三次握手,服务端确定客服端接收正常
- 保证双方都是双工通信
dream tutor论文学习
《能量分析攻击》这本书第二章研究了下,讲的都是概念化的密码学设备,大概是在讲鱼竿的构造吧。重要内容如下
- 互补型CMOS是实现数字电路逻辑元件最流行的技术
- 密码设备最重要的组成部件:专用密码硬件,通用密码硬件,密码软件,存储器,接口
- 互补型CMOS的特点:上拉网络和下拉网络不会同一时间内导通,意味着静态操作期间Vdd线和GND线之间几乎没有电流
第三章讲的是CMOS电路的消能量耗
-
电压尖峰起因是电流释放,毛刺:CMOS电路中的毛刺具有数据依赖性,并且对动态能量的消耗有很大影响
-
重要的汉明距离模型:
- 基本思想:计算数字电路在某个特定时间段内0->1转换和1->0转换的次数;然后利用转换的总数来刻画电路在该时段内的能量消耗,补充汉明距离等于v0与v1中相异的比特个数
- 攻击者通常采用汉明距离模型来刻画总线和寄存器的能量消耗
-
对能量分析攻击而言重要的仅仅是多次仿真所所获得能量消耗之间的差别
小项目部分
今日是RSA的完全实现:
预备知识:
昨天那篇文章中提到,RSA需要两个大素数,一般需要用Miller-Rabin素数测算算法
快速积和快速幂我是参考的这个大佬的博客
大佬博客
快速积原理20*14 = 20*(1110)2 = 20*(2^3)*1 + 20*(2^2)*1+20*(2^1)*1+20*(2^0)*0 = 160+80+40=280
快速幂就是反复平方法
int quickMultiply(int a, int b, int c){//其中a, b为要做乘法的数,c为数模
long long ans = 0, res = a;
while(b){
if(b & 1)ans = (ans + res) % c;
res = (res << 2) % c;
}
return (int)ans;
}
int quickPow(int a, int b, int c){
int ans = 1, res = a;
while(b){
if(b & 1)ans = quickMultiply(ans, res, c);//由于肯能会有大数相乘所以用快速积
res = quickMultiply(res, res, c);
b >>= 1;
}
return ans;
}
MillerRabin算法
bool MillerRabin(int n){
if(2 == n)return true;
if(n < 2 || !(n & 1))return false;
//将x - 1分解成2^k * m的样子
int m = n - 1, k = 0;
srand(time(NULL));
while(!(m & 1)){
k++;
m >>= 1;
}
int a = (rand() % (n - 1 - 1 + 1)) + 1; //选取为[1, n - 1]
//cout<<a<<endl;
int b = quickPow(a, m, n);
if(b == 1)return true;
for(int i = 0; i < k; i++){
if(b == n - 1)return true;//二次探测判断
else b = quickMultiply(b, b, n);
}
return false;
}
RSA部分
int RSAEn(int txt, int n, int e){
return quickPow(txt, e, n);
}
int RSADE(int txt, int n, int d){
return quickPow(txt, d, n);
}
int gcd(int a, int b){
if(!b)return a;
else return gcd(b, a % b);
}
bool checkMuPri(int a, int b){
return gcd(a, b) == 1;
}
秘钥生成那里还在debug总是有问题,明天再改吧,今天虽然也会走神,但其实干了好多事情了,听说高中班主任得了结肠癌,和高中同学聊了一会儿挺难受的,唉,怎么这两年总是糟心事情不断呢,希望我能考上之后告诉老师让他开心一下吧。