二进制异或--7.18待完善
對于一個數組a1a_1a1?,a2a_2a2?,……,ana_nan?,定義如下函數fff:
f(a1,a2,……,an)={a1,n=1f(a1⊕a2⊕a3⊕……an?1⊕an),n>1f(a_1,a_2,……,a_n)=\left\{ \begin{aligned} a_1 , & {n=1}\\ f(a_1 \oplus a_2 \oplus a_3 \oplus …… a_{n-1} \oplus a_n), & {n>1} \\ \end{aligned} \right. f(a1?,a2?,……,an?)={a1?,f(a1?⊕a2?⊕a3?⊕……an?1?⊕an?),?n=1n>1?
其中⊕代表二進制異或。現在進行qqq次詢問,每次詢問給定一段區間[l,r][l, r][l,r],你需要找出a1a_1a1?,a2a_2a2?,……,ara_rar?的一個子區間,使得這個區間的fff值盡可能大。
請編寫程序(編程語言不限),對“附件1.txt”和“附件2.txt”中的數據進行求解,輸出結果請分別放在兩個文本文件“1-ans.txt”和“2-ans.txt”中提交.
“附件1.txt”和“附件2.txt”的格式說明如下:
第一行,一個正整數nnn;
第二行,nnn個正整數,第iii個數為aia_iai?(0≤ai<2300 \le a_i<2^{30}0≤ai?<230);
第三行為一個正整數qqq;
接下來的qqq行,每行都有兩個數字l,r(l≤r)l,r(l \le r)l,r(l≤r),代表一次詢問。
輸出文件 1-1-ans.txt 和 1-2-ans.txt 的格式說明如下:
輸出qqq行,一行一個整數,代表答案。
樣例1:
| 3 | 5 |
| 8 4 1 | 12 |
| 2 | |
| 2 3 | |
| 1 2 |
樣例2:
| 6 | 60 |
| 1 2 4 8 16 32 | 30 |
| 4 | 12 |
| 1 6 | 3 |
| 2 5 |
樣例理解
第一行,一個正整數nnn,表示第二行有nnn個數,如:3;
第二行,nnn個正整數,第iii個數為aia_iai?(0≤ai<2300 \le a_i<2^{30}0≤ai?<230);
第三行,一個正整數qqq,表示接下來有qqq行;
接下來的qqq行,每行都有兩個數字l,r(l≤r)l,r(l \le r)l,r(l≤r),代表一次詢問。如樣例1中,第四行為2 3 ,表示對第二行的三個數(8 4 1)的第2個數到第3個數兩兩進行異或操作并獲取最大值;第五行為1 2 ,表示對第二行的三個數(8 4 1)的第1個數到第2個數兩兩進行異或操作并獲取最大值。
如上,樣例一輸出結果為5、12
解題思路
兩正整數的異或結果為非負數
關鍵步驟
完整代碼–python
import linecache import numpy as npfileName='附件2.txt' file1 = open("2-ans.txt", "a")''' TODO: 將txt文本中用逗號分割的內容轉為數字 如將: 1, 2 3, 4 轉到兩個int變量中 for line in fileName:x, y = map(int, line.split(',')) '''# 取第一個數 a = linecache.getline(fileName, 1) a = a.split() for i in a:mate_n = int(i) print(mate_n)# 取第二個數 b = linecache.getline(fileName, 2) b = b.split() c = [] for i in b:c.append(int(i)) mate_num = c print(mate_num)# 生成矩陣 matrix = np.zeros((mate_n+1, mate_n+1),dtype = np.uint) print(matrix)# 首行、首列賦值 for i in range(mate_n):matrix[0][i+1] = mate_num[i]matrix[i+1][0] = mate_num[i] print(matrix)# 求第一斜對角線 for i in range(2, mate_n+1):matrix[i][i-1] = matrix[i][0] ^ matrix[0][i-1] print(matrix)# 填充下三角 for j in range(3, mate_n+1):for i in range(j, mate_n+1):matrix[i][i-j+1] = matrix[i-1][i-j+1] ^ matrix[i][i-j+2] print(matrix)# # # 填充下三角--迭代 # for i in range(mate_n-2, mate_n+1): # 4 5 6 # for j in range(1, i-3): # 1 2 3 # if (i - j) % 2 != 0: # matrix[i][j] = matrix[i-2][j]^matrix[i][j+2] # print(matrix)# 首行重新賦值 for i in range(mate_n): # 0 1 2 3 4 5matrix[0][i+1] = i+1matrix[i+1][0] = i+1 print(matrix)# 讀取文件第4行 mate_q = linecache.getline(fileName, 3) mate_q = mate_q.split() for i in mate_q:mate_q = int(i) mate_q# 遍歷第4-q行,輸出 file = open(fileName, 'r') file.readline() file.readline() file.readline() for i in range(4, 4 + int(mate_q)): # 每行循環line = file.readline()line = line.split()c = []for j in line:if j.isdigit():c.append(int(j))a, b = c[0], c[1]smatrix = matrix[a:b+1,a:b+1]indexSmatrix = mate_num[a-1:b]matrix_utli = np.r_[smatrix, [indexSmatrix]]# txt = "這是第", i, "行", c, smatrix.max()txt = str(matrix_utli.max())file1.write(txt)file1.write('\n')file1.close() 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的二进制异或--7.18待完善的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两数之和--力扣
- 下一篇: 剑指offer:替换空格