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:題是不是出難了?