F题 n^2做法
前后缀分解dp这5个状态即可
怪不得我做的这么慢,原来是我没仔细看数据范围
#o 0 #v 1 #ov 2 #vo 3 #ovo 4 t=ii() for _ in range(t): s=input() n=len(s) pre=[[0]*5 for _ in range(n)] for i in range(n): if s[i]=="v": pre[i][1]=1 else: pre[i][0]=1 if i>0: for j in range(5): pre[i][j]+=pre[i-1][j] if s[i]=="v": pre[i][2]+=pre[i-1][0] #o+v -> ov else: pre[i][3]+=pre[i-1][1] #v+o -> vo pre[i][4]+=pre[i-1][2] #ov+o -> ovo suf=[[0]*5 for _ in range(n)] for i in range(n-1,-1,-1): if s[i]=="v": suf[i][1]=1 else: suf[i][0]=1 if i<n-1: for j in range(5): suf[i][j]+=suf[i+1][j] if s[i]=="v": #注意后缀要反过来,当前的字符是拼前面的 suf[i][3]+=suf[i+1][0] # vo <- v+o else: suf[i][2]+=suf[i+1][1] # ov <- o+v suf[i][4]+=suf[i+1][3] # ovo <- o+vo res=0 for i in range(n): f=[0,0,0,0,0] for j in range(i,n): if s[j]=="o": f[0]+=1 f[3]+=f[1] f[4]+=f[2] else: f[1]+=1 f[2]+=f[0] x=pre[i-1] if i>0 else [0]*5 y=suf[j+1] if j<n-1 else [0]*5 ans=f[4]+x[4]+y[4] # ovo ans+=x[0]*f[1]*y[0] # o + v + o -> ovo ans+=x[2]*f[0]+x[2]*y[0]+f[2]*y[0] # ov + o -> ovo ans+=x[0]*f[3]+x[0]*y[3]+f[0]*y[3] # o + vo -> ovo res=max(res,ans) print(res)