Cod sursa(job #1336059)

Utilizator sorynsooSorin Soo sorynsoo Data 6 februarie 2015 14:58:18
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.92 kb
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>

using namespace std;
char aux[1600],*p,sir[300001];
struct rct
{
    char cuv[17];
    int putere;
}v[101][101]; // v[propozitie][cuvinte];
bool cmp(rct A, rct B)
{
    return A.putere>B.putere;
}
int nrp,nrc[101],i,j,len,litere[30],putere,nr_carac,dim_mat,k,x,y,h,nr,max_nr;
char mat[600][600];

int main()
{
    //citire + prelucrare + punere in memorie
    while(1)
    {
        cin.getline(aux,1600);
        if(!strlen(aux))
            break;

        for(i=0; i<=26; i++)
            litere[i]=0;

        //elimin caracterele care nu sunt litere & fac literele mici
        len=strlen(aux); strlwr(aux);
        for(i=0; i<len; i++)
        {
            if(!isalpha(aux[i])  && aux[i]!=' ')
                strcpy(aux+i,aux+i+1);

            litere[aux[i]-'a']++;
        };

        //sparg sirul in cuvinte si il pun in memorie
        nrp++;
        p=strtok(aux," ");
        while(p)
        {
            strcpy(v[nrp][++nrc[nrp]].cuv,p);
            putere=0;
            for(i=0; i<strlen(p); i++)
                putere+= litere[p[i]-'a'];

            nr_carac+=strlen(p)+1;
            v[nrp][nrc[nrp]].putere=putere;
            p=strtok(NULL," ");
        }
    }

    //fac sortarea
    for(i=1; i<=nrp; i++)
        sort(v[i]+1,v[i]+nrc[i]+1,cmp);

    //alfu dimensiunea matricii
    nr_carac--;
    if((double)sqrt(nr_carac)>(int)sqrt(nr_carac))
        dim_mat=sqrt(nr_carac)+1;
    else
        dim_mat=sqrt(nr_carac);

    //bag totul intr-un sir
    for(i=1; i<=nrp; i++)
        for(j=1; j<=nrc[i]; j++)
        {
            for(h=0; h<strlen(v[i][j].cuv); h++)
                sir[++max_nr]=v[i][j].cuv[h];

            sir[++max_nr]='0';
        }


    //parcurg spirala
    nr=0;
    for (i=1;i<=(dim_mat/2)+(dim_mat%2);i++)
       {
         for (j=i; j<=dim_mat-i+1; j++)
         {
             if(nr>max_nr)
                mat[i][j]='0';
             else
                mat[i][j]=sir[++nr];
         }
         for (j=1+i; j<=dim_mat-i+1; j++)
         {
             if(nr>max_nr)
                mat[j][dim_mat-i+1]='0';
             else
                mat[j][dim_mat-i+1]=sir[++nr];
         }
         for (j=dim_mat-i;j>=i;j--)
         {
             if(nr>max_nr)
               mat[dim_mat-i+1][j]='0';
             else
               mat[dim_mat-i+1][j]=sir[++nr];
         }
         for (j=dim_mat-i; j>=i+1; j--)
         {
              if(nr>max_nr)
               mat[j][i]='0';
             else
               mat[j][i]=sir[++nr];
         }
       }
    for(i=1; i<=dim_mat; i++)
    {
        for(j=1; j<=dim_mat; j++)
        {
            if(mat[i][j]==NULL)
                cout<<"0 ";
            else
                cout<<mat[i][j]<<" ";
        }
        cout<<"\n";
    }

    cout<<"\n\n";
    cout<<sir+1;
}