Rezolvare completă PbInfo #2344 dvorak

Enunț

R. a descoperit de curând tastatura DVORAK și s-a decis că poate scrie mult mai rapid și mai corect cod folosind această tastatură decât folosind tastatura QWERTY. Plictisindu-se, R. a creat, pentru a onora tastatura lui preferată, transformarea dvorak, care se realizează prin înlocuirea fiecărei litere dintr-un șir de caractere cu corespondența acesteia dintr-o permutare dată a alfabetului englez. De exemplu, cuvântul informatica poate să devină, printr-o transformare dvorak, cburpmaycja.

H., profitor din fire, a decis să intre pe calculatorul lui R. și să îi fure sursele valoroase de la problemele “rupere” pe care le-a rezolvat.

Dar R. şi-a securizat calculatorul cu o parolă (constând într-o succesiune de litere mici ale alfabetului englez). Din când în când, R. își modifică o parte din parolă efectuând următoarea operație: alege două poziții în parolă Si (capăt stânga) si Di (capăt dreapta) apoi aplică transformarea dvorak asupra secvenței formată din caracterele situate în parolă pe poziții din intervalul [Si, Di]. Această operație este de tipul 1 și este codificată prin: 1 Si Di.

Acum H. are nevoie de ajutorul vostru ca să afle parola şi să furați împreună toate sursele ca sa fiți primii la statistici pe Varena). Din când în când, el vă va da câte un sir de caractere nevid (SIR) și vă va întreba dacă acest șir se regăsește ca subsecvență în parola lui R. Această operație este de tipul 2 și este codificată prin: 2 SIR

Cerința

Cunoscându-se permutarea dată, parola lui R. precum și o succesiune de Q operații de tipul 1 sau 2, găsiți răspunsurile la întrebările toate lui H.

Date de intrare

Pe prima linie a fișierului dvorak.in se va afla numărul natural Q reprezentând numărul de operații din succesiunea dată.
Pe cea de-a doua linie se va afla permutarea dată pentru transformarea dvorak.
Pe cea de-a treia linie se va afla un sir de caractere litere mici, reprezentând parola inițială a lui R.
Pe fiecare dintre următoarele Q linii se află câte o operație de tip 1 sau 2, codificate ca în enunț.

Date de ieșire

Pe fiecare linie a fișierului dvorak.out se va afla răspunsul pentru fiecare dintre intrebările lui H., în ordinea în care apar în fișierul de intrare: răspundeti cu Da dacă șirul se regăsește ca subsecvență în parola și Nu altfel.

Restricții și precizări

1 ≤ Q ≤ 500
• Fiecare al i-lea element al permutării date reprezintă litera în care se transformă cel de-al i-lea caracter din alfabetul englez într-o transformare dvorak
• Se garantează că fiecare literă din permutarea dată apare o singură dată, iar permutarea are fix 26 de caractere
• Parola este un șir de cel mult 500 de litere mici ale alfabetului englez.
• Pozițiile caracterelor din parolă sunt numerotate incepând de la 1
1 ≤ Si ≤ Dilungimea parolei
• Intervalele [Si, Di] corespunzătoare operației 1 se pot suprapune
• Șirul SIR pentru operația 2 are cel mult 500 de caractere


Exemplu

dvorak.in

6
ifynmlbkpduogahqzsjxcervwt
olimpiadadeinformatica
1 1 6
2 info
2 olimpiada
1 8 15
1 9 14
2 olimpiadadeinformaticaecool5

dvorak.out

Da
Nu
Nu

Explicație

După prima operație, parola se transformă în hopgqpadadeinformatica
La a doua operație se răspunde cu Da.
La a treia operație se răspunde cu Nu.
După a patra operație, parola se transformă în hopgqpaninmpalhrmatica.
După a cincea operație, parola se transformă în hopgqpanpagqiohrmatica.
La a șasea operație se răspunde cu Nu.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema dvorak:

#include <fstream>
#include <cstring>
#include <iostream>
using namespace std;

ifstream f("dvorak.in");
ofstream g("dvorak.out");

int N,Q,S,D;
char parola[510], cod[200],perm[50],sir[510];

void citeste()
{
    f>>Q;
    f>>perm;
    f>>parola;
}

void codificare()
{
    int i=0;
    for(char x='a'; x<='z'; x++)
        cod[x]=perm[i++];
}

void operatie1()
{
    for(int i=S-1; i<=D-1; i++)
        parola[i]=cod[parola[i]];
}
void operatie2()
{
    if(strstr(parola,sir)!=NULL)g<<"Da\n";
    else g<<"Nu\n";
}
int main()
{
    citeste();
    codificare();
    int op;
    for(int i=1; i<=Q; i++)
    {
        f>>op;
        if(op==1)
        {
            f>>S>>D;
            operatie1();
        }
        else
        {
            f>>sir;
            operatie2();
        }
    }
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2344 dvorak

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2344 dvorak de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!