Автор проблеми: | Хасан Салех (MathModel) |
Підготовлено: | Хасан Салех (MathModel) |
Редаговано: | Хасан Салех (MathModel) |
Рішення
Спочатку ми перетворюємо масив на рядок довжини n-1 наступним чином:
Тепер проблема полягає в тому, чи з'являється як підрядок за правилом відповідності
Оскільки обмеження невеликі, ми можемо просто спробувати кожну початкову позицію. Для кожного з 0 \le i \le (n-1)-k ми перевіряємо всі від до k-1. Якщо для деякого вище зазначена умова не виконується, то це вікно є поганим. Якщо ми знаходимо вікно, для якого це виконується для всіх , ми відповідаємо YES. Якщо жодне з вікон не підходить, ми відповідаємо NO.
Формально, ми відповідаємо YES тоді і тільки тоді, коли
Складність на тест становить : побудова займає , і ми перевіряємо максимум вікон, кожне за . Це відповідає заданій межі на \sum n\cdot k. Прикладні тести безпосередньо випливають з цього правила: коли рядок різниць масиву може бути прочитаний як шаблон після інтерпретації деяких '?' як '+' або '-', відповідь буде YES; в іншому випадку відповідь буде NO.
Складність .
def solve():
n,k=map(int,input().split())
a=list(map(int,input().split()))
s=input().strip()
t=[]
for i in range(n-1):
if a[i]<a[i+1]: t.append('+')
elif a[i]>a[i+1]: t.append('-')
else: t.append('?')
ok=False
for i in range(n-1-k+1):
good=True
for j in range(k):
x=t[i+j]; y=s[j]
if x=='?' or y=='?': continue
if x!=y:
good=False
break
if good:
ok=True
break
print("YES" if ok else "NO")
for _ in range(int(input())):
solve()