빈 문자열 S에 대해서
의 두가지 연산을 할 수 있다. query가 주어졌을때, i번째 문자가 알파벳이면 문자열 S에 1번 연산을, -이면 2번 연산을 한다.
연산을 한 뒤, 문자열 S에 팰린드롬 부분문자열의 개수를 세보자.
dp를 활용해서 푼다.
query가 queryr인 경우를 생각해보자.
queryr의 펠린드롬 부분 문자열은 query의 부분 문자열 개수 + query에 r이 추가됨으로서 생기는 부분 문자열의 개수
이다.
일반화 시키면,
str1 = str + str[-1]
이라고 했을때,
n_pellindrom[str1]
즉, str1의 부분 문자열 개수는 n_pellindrom[str] + str[-1]이 추가돼서 생긴 펠린드롬
이다.
def ispellindrom(string):
# 문자열이 추가됨으로서 펠린드롬이 생기는지 검사
count = 0
for i in range(len(string)):
tmp = string[i:]
left, right = 0, len(tmp)-1
flag = True
while left < right:
if tmp[left] != tmp[right]:
flag = False
break
left += 1
right -= 1
if flag == True:
count += 1
return count
전체 코드는 다음과 같다.
import sys
from collections import defaultdict
input = sys.stdin.readline
Q = int(input())
query = input().strip()
answer = [0 for _ in range(len(query))]
n_pellindrom = defaultdict()
S = ''
def ispellindrom(string):
# 문자열이 추가됨으로서 펠린드롬이 생기는지 검사
count = 0
for i in range(len(string)):
tmp = string[i:]
left, right = 0, len(tmp)-1
flag = True
while left < right:
if tmp[left] != tmp[right]:
flag = False
break
left += 1
right -= 1
if flag == True:
count += 1
return count
for i in range(len(query)):
pre = S
count = 0
# 연산하기
if query[i] == '-':
# 지우기 연산에는 펠린드롬 계산할 필요 x
S = S[:-1]
else:
tmp = 0
if S != '':
tmp = n_pellindrom[S]
S += query[i]
n_pellindrom[S] = tmp + ispellindrom(S)
print(n_pellindrom[S], end=' ')