BG Development


  Reply to this topicStart new topicStart Poll

> Задача от алгоритмичен вид
radbot
Публикувано на: 28-05-2023, 22:42
Quote Post



Име: Радослав
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 28.05.23



Здравейте, трябва ми помощ със следната задача:

QUOTE
Даден е стринг S, съставен само от главни латински букви. Дадени са и  Q заявки, всяка от които можете да е два типа.

1 i: Намерете максималната дължина на сегмент [b,e] , където 0 <= b <= i <= e < |S| и подстрингът S[b,e]  е съставен само от главната буква S[i]. Подстринг наричаме непрекъсната последователност от символи.

2 i:  Заменете буквата на позиция i с '#'.

И за двата типа заявки S[i] ще е различно от #. Буквите в стринга са номерирани от 0.

Препоръчителна е употребата на бърз вход и изход.

Input Format

Първият ред от стандартния вход съдържа стринга S. На втория ред се съдържат броя  Q на заявките. Всеки от следващите Q реда една заявка по гореописания формат.

Constraints
1 <= S <= 2 * 10^6
1 <= Q <= 2 * 10^6

Output Format

За всяка заявка от тип '1 i', отпечатайте на стандартния изход максималната дължина на подстринг от търсения вид.

Забележка: една последователност от главни букви може да се среща на повече от едно място в стринга, например: UUGFUUUFF

Sample Input 0

PPPUUUIIIBBBRRR
15
2 7
2 5
1 12
1 6
2 6
1 4
1 13
1 8
1 13
1 1
2 3
2 2
2 13
2 8
2 9
Sample Output 0
3
1
2
3
1
3
3
Sample Input 1
AABBBCCCC
5
1 0
2 1
1 0
2 2
1 3
Sample Output 1
2
1
2
Sample Input 2
XXYYY
3
1 3
2 3
1 2
Sample Output 2
3
1


Успях да я направя, но ми минават само малък процент от тестовете, като останалите тайм-аутват(вероятно заради големия вход). В последствие разбрах, че оптималното решение на задачата се постига, чрез графи, обаче нищичко не ми хрумва, моля за помощ и насоки. Благодаря.
PMEmail Poster
Top
akrachev
Публикувано на: 29-05-2023, 08:24
Quote Post



Име: акрачев
Група: Потребител
Ранг: Почетен член

Мнения: 1005
Регистриран на: 27.11.09



Щом е с графи защо не използваш GraphQL ?


--------------------
PMEmail PosterUsers Website
Top
radbot
Публикувано на: 29-05-2023, 09:01
Quote Post



Име: Радослав
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 28.05.23



Трябва ми решение на C++.
PMEmail Poster
Top
Bender++
Публикувано на: 29-05-2023, 12:31
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 414
Регистриран на: 18.04.21



Не си преписал правилно задачата, в примерните данни, казваш, че имаш 15 заявки, но в примерния изход имаш само 7 отговора. Другите 8 къде са ? И какбо е това "i" в условието ? Как се разбира дали правим заявка от тип 1 или тип 2 ? Нещо не си преписал както трябва и задачата ти няма смисъл


--------------------
Ваксините са лъжа и НЕ работят! Не на ковид фашизма!
Слава на Цар Путин! Долу украинските фашисти!
Слава на героите - Z V
PMEmail Poster
Top
radbot
Публикувано на: 30-05-2023, 11:02
Quote Post



Име: Радослав
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 28.05.23



1 i е заявка тип 1, 2 i е заявка тип 2. В примерния изход, който си посочил, редовете са 7, защото заявките от тип 1 са 7(а на output format-а пише, че трябва да вадим изход само за заявки от тип 1. Също така заявката се разбира каква е от pair-ите които подавам след стринга, например:
на втория ред на входа, който си посочил ти: 2 7 - заявка тип 2.
на третия ред на входа, който си посочил ти: 1 12 - заявка тип 1.
Също така, втория член на всяка двойка е цифра отговаряща на index в стринга

Мисля, че това са нещата, за които ме попита, пиши ако нещо съм пропуснал, но в условието на задачата няма грешка.

Това мнение е било редактирано от radbot на 30-05-2023, 11:15
PMEmail Poster
Top
wqw
Публикувано на: 02-06-2023, 13:58
Quote Post


Group Icon
Име: Владимир Висулчев
Група: VIP
Ранг: Почетен член

Мнения: 6345
Регистриран на: 10.06.04



> Препоръчителна е употребата на бърз вход и изход.

За GCC/MinGW сложи като първи ред в main нещо като cin.tie(0)->sync_with_stdio(0); ако все още не си го сложил и пробвай отново дали минава.

Аз лично бих я направил с нещо като Fenwick tree като маркирам началото на група с 1 а вътре в подстринговете слагам 0. По този начин за заявки от тип 1 по префиксна сума намирам индекса на групата на произволна позиция i за O(log N) и също заявки от тип 2 са ми O(log N) операция да update-на Fenwick дървото (то си е един прост масив, но това е друга тема).

Принципно при наивно решение проблем ще са ти заявките от втори тип (update), защото може да имаш дълги подстрингове, които като се разцепват на две *всички* индекси от втората част трябва да ги update-ваш, а те може да се милиони т.е. заявки тип 1 са ти O(1) докато заявки тип 2 са ти O(N) операция.

Примерно започваш от стринг от милион A-та, следват милион заявки от вида 2 1, 2 2, 2 3, ..., 2 1000000 и това означава че ще трябва да направиш 10^12 update-и, което няма как да мине на произволен judge.

cheers,
</wqw>

Това мнение е било редактирано от wqw на 02-06-2023, 13:59


--------------------
PMEmail PosterUsers Website
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0