Guest User

Untitled

a guest
Feb 19th, 2013
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "invertedindex.h"
  5.  
  6. int is_letter(char c) // Nu merge strlen pe unsigned char, aparent
  7. {
  8.     if(c < 'A' || (c > 'Z' && c < 'a') || c > 'z')
  9.         return 0;
  10.     return 1;
  11. }
  12.  
  13. Map_t *Alocare_Mapare()
  14. {
  15.     Map_t *map;
  16.     map=(Map_t*)malloc(sizeof(Map_t));
  17.     map->size = 1;
  18.     map->buckets=(Node_t**)malloc(map->size * sizeof(Node_t));
  19.     //map->buckets=(Node_t*)malloc(sizeof(Node_t));
  20.     //list=(ANode_t)malloc(rest*sizeof(Node_t));
  21.  
  22.     return map;
  23. }
  24.  
  25. void Realocare_Mapare(Map_t *map, int l)
  26. {
  27.     map->size = l+1;
  28.     map->buckets=(Node_t**)realloc(map->buckets, map->size * sizeof(Node_t));
  29.  
  30.     if(!map->buckets)
  31.         printf("Nasol"), exit(5);
  32. }
  33.  
  34. int IsWordInTable( Map_t map, int hs, char *s )
  35. {
  36.     Node_t *nod;
  37.     int cnt=0;
  38.     for(nod=map.buckets[hs]; nod; nod=nod->next, ++cnt)
  39.     {
  40.         if( strcmp(nod->data.word, s) == 0)
  41.             return cnt;
  42.     }
  43.     return -1;
  44. }
  45.  
  46. void AddWord( Map_t *map, int hs, char *s, int docID )
  47. {
  48.  
  49.     Node_t *node=(Node_t*)malloc(sizeof(Node_t));
  50.  
  51.     node->data.word=strdup(s);
  52.     node->data.documents.v = (int*)malloc(node->data.documents.cap * sizeof(int));
  53.     node->data.documents.v[0]=docID;
  54.     node->data.documents.n=1;
  55.     node->next = map->buckets[hs];
  56.     map->buckets[hs] = node;
  57. }
  58.  
  59. void AddFile( Map_t *map, int hs, char *s, int docID, int loc_cuvant)
  60. {
  61.     Node_t *node= map->buckets[hs];
  62.  
  63.     while(loc_cuvant--)
  64.         node=node->next;
  65.  
  66.     if( node->data.documents.v[node->data.documents.n-1] != docID )
  67.         node->data.documents.v[node->data.documents.n++] = docID;
  68. }
  69.  
  70.  
  71. void put_doc(Map_t *map, char *key, int docID)
  72. {
  73.  
  74.     int hs=hash((unsigned char*)key) % strlen(key);
  75.  
  76.     if(hs > map->size)
  77.         Realocare_Mapare(map, hs);
  78.  
  79.     int z=IsWordInTable(*map, hs, key);
  80.  
  81.     if(z==-1) //Nu exista cuvant
  82.         AddWord(map, hs, key, docID);
  83.     else
  84.         AddFile(map, hs, key, docID, z);
  85.  
  86. }
  87.  
  88. Array_t get_docs(Map_t *map, char *key)
  89. {
  90.     int hs=hash((unsigned char*)key) % strlen(key);
  91.     Node_t *nod = map->buckets[hs];
  92.  
  93.     while(nod)
  94.     {
  95.         if(strcmp(key, nod->data.word) == 0)
  96.             return nod->data.documents;
  97.         nod=nod->next;
  98.     }
  99.  
  100.     Array_t nul;
  101.     return nul;
  102. }
  103.  
  104. Array_t reunion(const Array_t files1, const Array_t files2)
  105. {
  106.     Array_t *array;
  107.     array= (Array_t*)malloc(sizeof(Array_t));
  108.     array->cap = 500;
  109.     array->n = 0;
  110.     array->v = (int*)malloc(array->cap * sizeof(int));
  111.  
  112.     int i=0, j=0, k=0;
  113.     while (i<files1.n && j<files2.n)
  114.     {
  115.         while(files1.v[i] < files2.v[j])
  116.         {
  117.             if(i==files1.n)
  118.                 break;
  119.             array->v[k++] = files1.v[i++];
  120.         }
  121.         while(files2.v[j] < files1.v[i])
  122.         {
  123.             if(j==files2.n)
  124.                 break;
  125.             array->v[k++] = files2.v[j++];
  126.         }
  127.  
  128.         if(files2.v[j] == files1.v[i])
  129.         {
  130.             int nr=files2.v[j];
  131.  
  132.             array->v[k++]=files2.v[j];
  133.             while(files1.v[i] == nr)
  134.             {
  135.                 if(i==files1.n)
  136.                     break;
  137.                 i++;
  138.             }
  139.             while(files2.v[j] == nr)
  140.             {
  141.                 if(j==files2.n)
  142.                     break;
  143.                 j++;
  144.             }
  145.         }
  146.     }
  147.     while(i < files1.n)
  148.             array->v[k++] = files1.v[i++];
  149.     while(j < files2.n)
  150.         array->v[k++] = files2.v[j++];
  151.  
  152.     array->n=k;
  153.  
  154.     return *array;
  155. }
  156.  
  157. Array_t intersection(const Array_t files1, const Array_t files2)
  158. {
  159.     Array_t *array;
  160.     array= (Array_t*)malloc(sizeof(Array_t));
  161.     array->cap = 500;
  162.     array->n = 0;
  163.     array->v = (int*)malloc(array->cap * sizeof(int));
  164.  
  165.     int i=0, j=0, k=0;
  166.     while (i<files1.n && j<files2.n)
  167.     {
  168.         while(files1.v[i] < files2.v[j])
  169.         {
  170.             i++;
  171.             if(i==files1.n)
  172.                 break;
  173.         }
  174.         while(files2.v[j] < files1.v[i])
  175.         {
  176.             j++;
  177.             if(j==files2.n)
  178.                 break;
  179.         }
  180.  
  181.         if(files2.v[j] == files1.v[i])
  182.         {
  183.             int nr=files2.v[j];
  184.  
  185.             array->v[k++]=files2.v[j];
  186.             while(files1.v[i] == nr)
  187.             {
  188.                 if(i==files1.n)
  189.                     break;
  190.                 i++;
  191.             }
  192.             while(files2.v[j] == nr)
  193.             {
  194.                 if(j==files2.n)
  195.                     break;
  196.                 j++;
  197.             }
  198.         }
  199.     }
  200.     array->n=k;
  201.  
  202.     return *array;
  203. }
  204.  
  205. void solve()
  206. {
  207.     FILE *f[500], *in, *out;
  208.     in=fopen("input.in", "rt");
  209.     out=fopen("output.out", "wt");
  210.     int nrFisiere, nrTokeni, i;
  211.     Map_t *map=Alocare_Mapare();
  212.     //Deschidere n fisiere
  213.     fscanf(in, "%i", &nrFisiere);
  214.     int cnt=0;
  215.     for(i=0;i<nrFisiere;i++)
  216.     {
  217.         char nume[250];
  218.         fscanf(in, "%s", nume);
  219.         f[i]=fopen(nume, "rt");
  220.         if(!f[i])
  221.             printf("eroare la deschiderea fisierului %i\n", i+1);
  222.  
  223.         while(!feof(f[i])) // Ciudat, ultimul cuvant il citeste de 2 ori (unharmful)
  224.         {
  225.             char s[500];
  226.             fscanf(f[i], "%s", s);
  227.             int l=strlen(s);
  228.  
  229.             //Cazuri Exceptie
  230.             if(s[l-3] == '.' && s[l-2] == '.' && s[l-1] == '.')
  231.                 s[l-3] = 0;
  232.  
  233.             if(!is_letter(s[0])) // (Ceva
  234.                 strcpy(s, s+1);
  235.             if(!is_letter(s[0]))
  236.                 strcpy(s, s+1);
  237.  
  238.  
  239.             if(!is_letter(s[l-2]) && l-3>0) //Asd).
  240.                 s[l-2]=0;
  241.             else if(!is_letter(s[l-1]) && l-2>0) //Asd. sau Asd) sau asd! etc.
  242.                 s[l-1]=0;
  243.  
  244.             if( strcmp("subject", s) == 0)
  245.                 printf("%i\n", hash((unsigned char*)s)%strlen(s));
  246.  
  247.             if(s[0] == ' ' || strlen(s) == 0)
  248.                 continue;
  249.  
  250.             put_doc(map, s, i);
  251.         }
  252.         fclose(f[i]);
  253.     }
  254.  
  255.     //Citire m tokeni
  256.     fscanf(in, "%i", &nrTokeni);
  257.     char token[500], ctoken[500];
  258.     fgets(token, 500, in);
  259.     for(i=0;i<nrTokeni;i++)
  260.     {
  261.         char *p;
  262.         fgets(token, 500, in);
  263.         Array_t files1, files2;
  264.         if(token[strlen(token)-2] < 'A')
  265.             token[strlen(token)-2]=0;
  266.         else if(token[strlen(token)-1] < 'A')
  267.             token[strlen(token)-1]=0;
  268.  
  269.         strcpy(ctoken, token);
  270.  
  271.         p=strtok(token, "!?; ");
  272.         while(p!=NULL)
  273.         {
  274.             if(p[strlen(p)-2] < 'A') //Random char?
  275.                 p[strlen(p)-2]=0;
  276.             else if(p[strlen(p)-1] < 'A' )
  277.                 p[strlen(p)-1]=0;
  278.  
  279.             if(strcmp(p, "&") == 0)
  280.             {
  281.                 p=strtok(NULL, " !?;");
  282.                 if(p[strlen(p)-2] < 'A') //Random char?
  283.                     p[strlen(p)-2]=0;
  284.                 else if(p[strlen(p)-1] < 'A' )
  285.                     p[strlen(p)-1]=0;
  286.  
  287.                 files2 = get_docs(map, p);
  288.                 files1 = intersection(files1, files2);
  289.             }
  290.             else if(strcmp(p, "|") == 0)
  291.             {
  292.                 p=strtok(NULL, " !?;");
  293.                 if(p[strlen(p)-2] < 'A') //Random char?
  294.                     p[strlen(p)-2]=0;
  295.                 else if(p[strlen(p)-1] < 'A' )
  296.                     p[strlen(p)-1]=0;
  297.  
  298.                 files2 = get_docs(map, p);
  299.  
  300.                 files1 = reunion(files1, files2);
  301.             }
  302.             else
  303.                 files1 = get_docs(map, p);
  304.             p=strtok(NULL, " !?;");
  305.         }
  306.  
  307.         fprintf(out, "%s:", ctoken);
  308.         int j;
  309.         for(j=0;j<files1.n;j++)
  310.             fprintf(out, " %i", files1.v[j]);
  311.         fprintf(out, "\n");
  312.  
  313.     }
  314. }
  315.  
  316. int main (int argc, char *argv[])
  317. {
  318.     solve();
  319.  
  320.     return 0;
  321. }
  322.  
  323. /*
  324.         int ind=0;
  325.     for(ind=0; ind<=map->size; ind++)
  326.     {
  327.         fprintf(out, "%i\n", ind);
  328.         Node_t *nodut=map->buckets[ind];
  329.         while(nodut)
  330.         {
  331.             fprintf(out, "%s ", nodut->data.word);
  332.             int j;
  333.             for(j=0;j<nodut->data.documents.n;j++)
  334.                 fprintf(out," %i", nodut->data.documents.v[j]);
  335.             nodut=nodut->next;
  336.             fprintf(out, "\n");
  337.         }
  338.     }
  339. */
Advertisement
Add Comment
Please, Sign In to add comment