1. 程式人生 > 實用技巧 >【模擬】第二屆全國高校綠色計算大賽 預賽第二階段(Python) 文字編輯器

【模擬】第二屆全國高校綠色計算大賽 預賽第二階段(Python) 文字編輯器

傳送門

這是一個模擬題,因為之前做過一個分塊題目,直接想錯了。糾結了好久,今天上午突然明悟過來

題意

image-20200825184537784

思路

 看資料大小,直接模擬連結串列。
 最前和最後新增上一個節點,這樣寫起來比較好
 相當於複習了一遍 c 語言學的連結串列,寫起來還是挺噁心的。

程式碼

  1'''
2Autor:valk
3Date:2020-08-1918:23:25
4LastEditTime:2020-08-2518:21:45
5Description:如果邪惡是華麗殘酷的樂章它的終場我會親手寫上晨曦的光風乾最後一行憂傷黑色的墨染上安詳
6'''

7class
Task(object):
#print
8defsolver(self,s,p,ops):
9N=3*(10**5)+10
10pre=[0foriinrange(N)]
11nex=[0foriinrange(N)]
12t=[0foriinrange(N)]
13aga=0
14pre[aga]=-1
15nex[aga]=1
16n=len(s)
17foriinrange(len(s)):
18t[i+1]=s[i]
19pre[i+1]=i
20nex[i+1]=i+2
21en=n+1
22pre[en]=n
23nex[en]=-1
24n+=1
25definsert(text):
26nonlocal
n,pre,nex,aga,en,t,N,p
27rec=nex[p]
28nex[p]=n+1
29pre[n+1]=p
30foriinrange(len(text)):
31n+=1
32t[n]=text[i]
33ifi!=0:
34pre[n]=n-1
35nex[n]=n+1
36nex[n]=rec
37pre[rec]=n
38p=n
39defback(l):
40nonlocaln,pre,nex,aga,en,t,N,p
41i=1
42tmp=p
43while(i<=landpre[tmp]!=-1):
44tmp=pre[tmp]
45i+=1
46nex[tmp]=nex[p]
47
pre[nex[p]]=tmp
48p=tmp
49defdelete(l):
50nonlocaln,pre,nex,aga,en,t,N,p
51i=0
52tmp=p
53while(i<=landnex[tmp]!=-1):
54tmp=nex[tmp]
55i+=1
56iftmp==p:#特判這裡,否則會死迴圈
57return
58nex[p]=tmp
59pre[tmp]=p
60defshiftL(l):
61nonlocaln,pre,nex,aga,en,t,N,p
62i=1
63while(i<=landpre[p]!=-1):
64p=pre[p]
65i+=1
66defshiftR(l):
67nonlocaln,pre,nex,aga,en,t,N,p
68i=1
69while(i<=landnex[p]!=en):#這裡不能跑到最後一個
70p=nex[p]
71i+=1
72foropinops:
73ifop[0]=='I':
74insert(op[1])
75ifop[0]=='B':
76back(int(op[1]))
77ifop[0]=='D':
78delete(int(op[1]))
79ifop[0]=='L':
80shiftL(int(op[1]))
81ifop[0]=='R':
82shiftR(int(op[1]))
83now=nex[aga]
84
85ans=''
86while(now!=en):
87ans+=str(t[now])
88now=nex[now]
89returnans
90'''
91s=input()
92pos=int(input())
93t=int(input())
94ops=[]
95foriinrange(t):
96op=list(input().split())
97ops.append(op)
98valk=Task()
99print(valk.solver(s,pos,ops))
100'''

101'''
102whatsyourproblem
1035
1046
105L2
106D1
107R4
108Iabcdef
109L3
110B2
111'''