首页 > 其他分享 >C题和D题

C题和D题

时间:2024-10-19 14:23:13浏览次数:3  
标签: cnt 遍历 ans range orj ori

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.

标签:,cnt,遍历,ans,range,orj,ori
From: https://www.cnblogs.com/mandala2/p/18471110

相关文章