Rezolvare completă PbInfo #1947 Cuvinte6

Corina are un text format din mai multe cuvinte separate între ele printr-un spațiu, pentru care trebuie să utilizeze cuvintele aflate pe poziţii consecutive. Se știe că pentru două cuvinte pe care le vom numi x și y:

  • cuvântul x=x[0]x[1]...x[n-1] este prefix al cuvântului y=y[0]y[1]...y[m-1], dacă x[0]=y[0], x[1]= y[1],…, x[n-1]=y[n-1]
  • cuvântul x=x[0]x[1]...x[n-1] este sufix al cuvântului y=y[0]y[1]...y[m-1], dacă există un indice i, (0≤ i≤ m-1), astfel încât x[0]=y[i], x[1]= y[i+1],…, x[n-1]= y[m-1].

Cerința

Scrieţi un program care determină pentru un text dat, format din mai multe cuvinte separate între ele printr-un spațiu, două cerințe:

  • cerința 1: câte perechi de cuvinte, notate x și y, aflate pe poziții consecutive în text au proprietatea: x este sufix al lui y sau x este prefix al lui y.
  • cerința 2 : care este perechea de cuvinte, aflate pe poziții consecutive în text, care conține cele mai multe caractere.

Date de intrare

Fișierul de intrare cuvinte6.in conține pe prima linie un text, format din mai multe cuvinte separate între ele printr-un spațiu și pe a doua linie conține un număr natural t, care reprezintă cerința (dacă t=1 se va rezolva cerința 1, dacă t=2 se va rezolva cerința 2).

Date de ieșire

Fișierul de ieșire cuvinte6.out va conține pe prima linie, pentru cerința 1, un număr natural, ce reprezintă numărul de perechi de cuvinte, notate x și y, aflate pe poziții consecutive în text care au proprietatea: x este sufix al lui y sau x este prefix al lui y.

Fișierul de ieșire cuvinte6.out va conține pe prima linie, pentru cerința 2 două cuvinte, separate printr-un spațiu, ce reprezintă perechea de cuvinte, aflate pe poziții consecutive în text, care conține cele mai multe caractere.

Restricții și precizări

  • Textul dat conține cel mult 500 de caractere
  • Fiecare cuvânt din text este format numai din litere mici ale alfabetului englez
  • Fiecare cuvânt din text conține cel puțin o literă și cel mult 20 de litere
  • Pentru cerința 2, dacă textul dat are mai multe perechi de cuvinte, aflate pe poziții consecutive în text, care conțin cele mai multe caractere, se va afișa prima pereche din text, cu această proprietate.

Exemplul 1

cuvinte6.in

calcul calcule are care parcare corecte corectie
1

cuvinte6.out

3

Explicație

Cerința 1:
Textul conține 3 perechi de cuvinte : (calcul,calcule), (are,care), (care,parcare).

Exemplul 2

cuvinte6.in

calcul calcule are care parcare corecte corectie
2

cuvinte6.out

corecte corectie

Explicație

Cerința 2: Perechea de cuvinte corecte corectie conține 14 caractere și reprezintă perechea cu cele mai multe caractere din text.

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 Cuvinte6:

#include <fstream>
#include<string.h>
using namespace std;
char c[2001],*pc[1001];
int n;
ifstream fin("cuvinte6.in");
ofstream fout("cuvinte6.out");
int prefix(char x[],char y[])
{
    int lg1,lg2,i;
    lg1=strlen(x);
    lg2=strlen(y);
    if(lg1>lg2)
        return 0;
    for(i=0;i<lg1;i++)
        if(x[i]!=y[i])return 0;
    return 1;
}

int sufix(char x[],char y[])
{
    int lg1,lg2,i,j;
    lg1=strlen(x);
    lg2=strlen(y);
    if(lg1>lg2)
        return 0;
    for(i=lg1-1,j=lg2-1;i>=0;i--,j--)
        if(x[i]!=y[j])return 0;
    return 1;
}
void cerinta1()
{
    int nr,i;
    nr=0;
    for(i=0;i<n-1;i++)
        if(prefix(pc[i],pc[i+1]) || sufix(pc[i],pc[i+1]))
            nr++;
    fout<<nr<<endl;
}

void cerinta2()
{
    char *u,*v;
    int lg1,lg2,lgt,lgtm,i;
    lg1=strlen(pc[0]);
    lg2=strlen(pc[1]);
    lgtm=lg1+lg2;
    u=pc[0];
    v=pc[1];
    for(i=1;i<n-1;i++)
    {
        lg1=lg2;
        lg2=strlen(pc[i+1]);
        lgt=lg1+lg2;
        if(lgt>lgtm)
        {
            lgtm=lgt;
            u=pc[i];
            v=pc[i+1];
        }
    }
    fout<<u<<<<v<<endl;
}
int main()
{
    char *p;
    int t;
    fin.getline(c,2001);
    fin>>t;
    n=0;
    p=strtok(c," ");
    while(p)
    {
        pc[n]=p;
        n++;
        p=strtok(NULL," ");
    }
    if(t==1)
        cerinta1();
    else cerinta2();
    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 #1947 Cuvinte6

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1947 Cuvinte6 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!