Powered by:AB_IN 局外人
jtq的笔
单纯的模拟。
题目什么意思呢?
求字符串中一个非前缀子串恰好为字符串的前缀的最大长度。
下面是简单的模拟
t=int(input())
while t>0:
t-=1
s=input();ans=0
for i in range(len(s)):
tmp=s[:i+1]
if tmp in s[1:]:
ans=len(tmp)
print(ans)
但如果数据到了10个1e5长的串,一定会tle。
那么我们就得减少复杂度。
符合的不管他,不符合的停住,看不符合的前一个。
正规代码如下。
i = int(input())
while i>0:
i-=1
x = input()
for j in range(1,len(x)+1):
if x.find(x[0:j],1,len(x))==-1 or j==len(x):
print(j-1)
break
pb的苦恼
去除不必要的站点什么意思呢? 就是站点去重罢了。
至少多少个座位呢? 就是保证最大值即可。
题目就是模拟上下车而已。把全从a上车的,下车的,都计数,和状态量取最大值即可。
t=int(input());s=set();d=dict()
while t>0:
s.clear();ans=0;d.clear();cnt=0
t-=1
n=int(input())
for i in range(n):
a,b=map(int,input().split())
s.add(a);s.add(b)
try:
d[a]+=1
except:
d.setdefault(a,1)
try:
d[b]-=1
except:
d.setdefault(b,-1)
a=sorted(d.items())#变成全是元组的列表
for i in a:
cnt+=i[1]
ans=max(ans,cnt)
a.clear()
print(len(s),ans)
这里考一些set
dict
list
的综合运用。
普及一下不太熟悉的dict
dict.get(key, default=None)
key – 字典中要查找的键。
default – 如果指定键的值不存在时,返回该默认值。
返回指定键的值,如果值不在字典中返回默认值None。
比如d.get(3,0)
如果键值3不存在,则返回0.dict.items()
返回可遍历的(键, 值) 元组数组。dict.setdefault(key, default=None)
key – 查找的键值。
default – 键不存在时,设置的默认键值。
如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
比如d.setdefault(a,1)
,如果键值a不存在,就赋值1。一般配合try break
食用更加哦。
下面是一个差点tle的代码。
t=int(input());s=set();up=dict();down=dict()
while t>0:
s.clear();up.clear();down.clear();ans=0;cnt=0
t-=1
n=int(input())
for i in range(n):
a,b=map(int,input().split())
s.add(a);s.add(b)
try:
up[a]+=1
except:
up.setdefault(a,1)
try:
down[b]+=1
except:
down.setdefault(b,1)
ans=0
#下面四行是对up和down字典根据键排序。
tmp1=sorted(up.items(), key=lambda x: x[0])
new_up = {i[0]: i[1] for i in tmp1}
tmp2=sorted(down.items(), key=lambda x: x[0])
new_down = {i[0]: i[1] for i in tmp2}
lst=list(sorted(s))
for i in lst:
ans+=new_up.get(i,0);ans-=new_down.get(i,0)
cnt=max(cnt,ans)
print(len(s),cnt)
因为这个题的原型还是个c++设计的,所以都得排序从头开始。
py里字典添加值是不会随时排序的,这和c++的map
不同。map
运用迭代器,会从最小的键开始。
py里集合也不会随时排序。
所以正规c++代码
#include <bits/stdc++.h>
using namespace std;
int T, n, a[100005], b[100005];
set<int> s;
map<int, int> up, down;
int ans1, ans2,t;
int main() {
scanf("%d", &T);
while(T--) {
ans1=0; ans2=0;t=0;
s.clear(); up.clear(); down.clear();
scanf("%d", &n);
for (int i=1; i<=n; ++i) {
scanf("%d%d", &a[i], &b[i]);
s.insert(a[i]); s.insert(b[i]);
up[a[i]]++; down[b[i]]++;
}
for (auto it=s.begin(); it!=s.end(); ++it) {
t+=up[*it]; t-=down[*it];
ans2=max(ans2, t);
}
ans1=s.size();
printf("%d %d\n", ans1, ans2);
}
return 0;
}
完结。
ps:题是不是出难了?
扫描二维码关注公众号,回复:
11402219 查看本文章