思路:使用两个滑窗记录当前歌词列表和选择的歌词,根据字符串中操作指令模拟即可
代码:
#感觉很简单,就是两个滑窗,一个长度为4,一个长度为1
#注意,大滑窗带一个光标,要与小滑窗区别开
#当然,要对歌曲总数做分类讨论
n=int(input())
s=list(input())
ans=0#存储最后选中的歌曲,即小滑窗,这里从0开始计数,方便后面做模运算
lst=[i for i in range(1,4)]#存储屏幕显示的歌曲,即大滑窗,n小于4时这里初始化会有问题,在下面的if中纠正
flag=1#存储大滑窗中光标选中的歌曲下标

#歌曲总数比屏幕小,只需要处理小滑窗
if n<=4:
    #处理小滑窗
    for i in s:
        if i=="U":
            ans=(ans-1+n)%n
        elif i=="D":
            ans=(ans+1)%n
    #处理大滑窗
    lst=[i for i in range(1,n+1)]

#歌曲总数比屏幕大,大小滑窗都要处理。
else:
    #处理小滑窗、大滑窗
    for i in s:
        if i=="U":
            if flag==1:#光标在第一个,大滑窗需要更新
                if ans==0:#并且是第一首歌
                    flag=4
                    #更新大滑窗
                    lst=[i for i in range(n-3,n+1)]
                else:
                    flag=1
                    #更新大滑窗
                    lst=[i-1 for i in lst]#每个元素都减1
            else:
                flag-=1#光标在2、3、4,直接光标上移即可
            ans=(ans-1+n)%n#处理小滑窗
        elif i=="D":
            if flag==4:#光标在最后一个,大滑窗需要更新
                if ans==n-1:#当前为最后一首歌
                    flag=1
                    lst=[i for i in range(1,5)]
                else:
                    flag=4
                    lst=[i+1 for i in lst]
            else:
                flag+=1
                    
            ans=(ans+1)%n#处理小滑窗
#输出结果
for i in lst:
    print(i,end=" ")
print()
print(ans+1)