C題和D題

fafatadie發表於2024-10-19

https://atcoder.jp/contests/abc375/tasks/abc375_d
本體程式碼如下:

S = input()

cnt = [0] * 26
for s in S:
cnt[ord(s) - 65] += 1

cnt2 = [0] * 26
ans = 0

for s in S:
p = ord(s) - 65
cnt[p] -= 1
for i in range(26):
ans += cnt[i] * cnt2[i]
cnt2[p] += 1

print(ans)
這道題輸入的是一個字串(全是大寫),看了一下大佬的程式碼感覺很牛逼,分享一下:
先用一個陣列分別儲存每個字元的個數,再遍歷字串中的所有元素,直到cnt全部為0,先總說一下,cnt陣列裡面的元素間接存的是沒有被遍歷過的字元,而cnt2則是遍歷過後的字元,對於每一個正在遍歷的字元來說,以它為中間元素,第一個元素從cnt陣列中隨便取一個不為0的間接元素,而cnt2同樣如此,舉個例子,就好比遍歷到了下面圖片中的對字串ABCACC遍歷到指定的C時,如下圖:
然後把每個遍歷時的情況都求一下,加到ans上,相加就得到了結果!

4.C - Spiral Rotation
這道題的意思就是給一個二維矩陣,然後不斷旋轉(順時針),旋轉一次後旋轉的部分變成了去掉最外層的矩陣,最後輸出旋轉完後的矩陣。
把每個點的旋轉次數計算出來,在進行操作即可,這道題還可以用一個矩陣來做,但要按順序來遍歷才可以,新建一個矩陣來做的話順序就沒有這麼重要了。
程式碼python:
n = int(input())
grid = []
for i in range(n):
grid.append(list(input()))//為了更好的輸出矩陣,儲存的形式[['.', '.', '.', '.', '.', '.', '.', '#'], ['.', '.', '.', '.', '.', '.', '.', '#'], ['.', '#', '#', '#', '#', '.', '.', '#'], ['.', '#', '#', '#', '#', '.', '.', '#'], ['.', '#', '#', '.', '.', '.', '.', '#'], ['.', '#', '#', '.', '.', '.', '.', '#'], ['.', '#', '#', '#', '#', '#', '#', '#'], ['.', '#', '#', '#', '#', '#', '#', '#']]這樣的形式

ans = [["" for i in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
c = min(i + 1, n - i, j + 1, n - j)//求這個點的旋轉次數
ori = i + 1
orj = j + 1
if c % 4 == 0:
ori = i + 1
orj = j + 1
elif c % 4 == 1:
ori = n - j
orj = i + 1
elif c % 4 == 2:
ori = n - i
orj = n - j
elif c % 4 == 3:
ori = j + 1
orj = n - i
ans[i][j] = grid[ori - 1][orj - 1]

for i in ans:
print("".join(i))

在圖片中,所有行為i + 1 或 n - i和所有列為j + 1或者 n - j的點旋轉次數都是最小的那個值模4.

相關文章