1 Star 1 Fork 0

bensonrachel/Atcoder_algorithm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
TPM(step3)F. Card Substrings(CF).py 1.52 KB
一键复制 编辑 原始数据 按行查看 历史
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/8/27
# @File : TPM(step3)F. Card Substrings(CF).py
def TPM():
l = 0
res = 0
tag = 0#溢出标志tag
for r in range(n):
dict2[str1[r]] += 1
if (dict2[str1[r]] > dict1[str1[r]]):
tag = 1
while (tag == 1):
dict2[str1[l]] -= 1
if (dict2[str1[r]] <= dict1[str1[r]]):
tag = 0
l += 1
res += (r - l + 1)
return res
"""
套step2 E题 求区间有多少个不同的数字 的代码框架。
如何判断[l,r]是否符合题意呢?
本来,只用了一个字典,,然后多次深度拷贝重复数每个区间是否超出卡片指标
然后就TLE了。。。。
正确做法:
用两个字典,一个是str2的指标数,不会变。一个来记录当前的区间的各个字符数,会改变
如果遇到一个字符超出指标则说明此区间的右端点超出了指标,然后不断l前进,继续更新第二个字典(减操作)
然后如果刚刚超时指标的字符恢复了,就可以退出while
然后说明当前这个lr区间符合,则此时[l,r],[l+1,r]...[r,r]一定都符合题意
累加(r - l + 1)
"""
if __name__ == "__main__":
n, m = map(int, input().split())
str1 = input()
str2 = input()
dict1 = dict()
dict2 = dict()
for item in str1:
dict1[item] = 0
dict2[item] = 0
for item in str2:
if (item in str1):
dict1[item] += 1
print(TPM())
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/bensonrachel/atcoder_algorithm.git
git@gitee.com:bensonrachel/atcoder_algorithm.git
bensonrachel
atcoder_algorithm
Atcoder_algorithm
master

搜索帮助