前言
有朋友推薦一個新的算法練習網站leetcode,說北美的公司招人都是400題起步,國內公司招聘也經常用到,上海的尤其多。
很有意思,可以花點時間做做leetcode,看看題目質量。
這次更新的仍然是CodeForces的Contest710。
正文
A
題目鏈接
題目大意
一個8*8的棋盤,輸入一個點表示國際象棋中的king的位置,求king能行動的格子數量;
輸入兩個字符,表示列和行。 列是'a'到'h',行是1到8。
Example
input
e4
output
8
題目解析
題目較簡單,看如何實現比較方便。
列-'a'得到索引x;
行-'1'得到索引y;
特判當king在邊界的時候和同時在兩個邊界的時候。
B
題目鏈接
題目大意
輸入n個x軸上的點,輸出和n個點距離最近的點,如果有多個點,輸出最左邊的那個點。
n (1?≤?n?≤?3 * 1e5)
x[i] (?-?1e9?≤?x[i]?≤?1e9)
Example
input
4
1 2 3 4
output
2
** 題目解析**
對點排序,易知最后的點在最中間。
對于在[A, B]中的點x,易知x到A和B的距離是固定;
那么對于[A, B, C]的最優解,必然是在B;
同上,在[A,B,C,D]中,點x到A和D的距離是固定的,同時與x到[B, C]的最優解的重疊。
類推,得到答案就是排序完最中間靠左邊的點。
C
題目鏈接
題目大意
輸入一個奇數n,輸出一個n*n的矩陣,矩陣內數字從1到n*n。
矩陣的要求是行、列、對角線的和都是奇數。
n (1?≤?n?≤?49)
Examples
input
1
output
1
input
3
output
2 1 4
3 5 7
6 9 8
題目解析
我們把1到n*n的數字抽象成0,1.(根據奇偶性)
我們來看 n=3的時候
010
111
010
問題是當n=5的時候,如何構造?
已知,n=3的矩陣,那么只要保證n=3外面的矩陣行列和都是偶數就行。
1 010 1
0 010 0
1 111 1
0 010 0
1 010 1
那么題目可以變成這樣一圈圈的去構造;
并且為了方便,從中心開始構造最為簡單。
E
題目鏈接
題目大意
構造n個'a'字符,x為insert/delete 'a'一次的代價,y為復制粘貼一次的代價。
n, x and y (1?≤?n?≤?107, 1?≤?x,?y?≤?109).
Examples
input
8 1 1
output
4
input
8 1 10
output
8
題目解析:
動態規劃。
dp[i] 表示構造i個字符的最優解。
對應三種可能,三個狀態轉移。
dp[i] = min(dp[i], dp[i + 1] + x); 刪除
dp[i + 1] = min(dp[i + 1], dp[i] + x); 增加
dp[i * 2] = min(dp[i * 2], dp[i] + y); 雙倍
1 2 4 8 16 13 26 52 刪除3次,double 6次
1 2 4 6 12 13 25 52 增加3次,double 6次
F
題目鏈接
題目大意
m個操作。
操作1,把一個字符串s放入集合D,每次插入不同;
操作2,把一個字符串s從集合D刪除,保證有值;
操作3,詢問一個字符串x在集合中子串的數量。
m (1?≤?m?≤?3·1e5)
Examples
input
5
1 abc
3 abcabc
2 abc
1 aba
3 abababc
output
2
2
題目解析:
題目有一個很重要的性質:每次插入不同。
于是可以插入建一個自動機,刪除建一個自動機,相減即可。
查找函數再引入一個dp值,如果訪問一次,就記錄當前值。這樣每個點就只訪問一次
build函數,dp值=-1 比較關鍵
這里的字典樹要引入一個flag來標志是否真的有孩子。(build之后,及時字典樹沒有孩子,ch指針也會指向fail指針)死循環了幾次
插入和更新,在引入一個flag,有更新之后再重新build
如果題目數據更強:(隊友提供的神優化)
再引入logN的優化,建logN個自動機,分別存放1、2、4、8等個自動機。
總結
A、B是簡單題,C是構(腦)造(洞)題,E是動態規劃,F是AC自動機。
新年快樂~