Cod sursa(job #133418)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 8 februarie 2008 16:43:55
Problema Secventa 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.67 kb
//knuth-morris-pratt
#include<stdio.h>
#include<string.h>
FILE*fin=fopen("kmp.in","r");
FILE*fout=fopen("kmp.out","w");
char s[100],t[100];
int sup[100],n,m;
void prefix()
{
  int k=0,i;
  sup[1]=0;
  for(i=2;i<=m;i++)
  {
    while(k>0&&s[k]!=s[i-1]) k=sup[k];
    if(s[k]==s[i-1]) k++;
    sup[i]=k;
  }
}
void kmp()
{
  int k=0,i;
  for(i=1;i<=n;i++)
  {
    while(k>0&&t[i-1]!=s[k]) k=sup[k];
    if(t[i-1]==s[k]) k++;
    if(k==m){fprintf(fout,"potrivire de la %d\n",i-m+1);k=sup[k];}
  }
}
int main()
{
  fscanf(fin,"%s",&s);
  fscanf(fin,"%s",&t);
  fclose(fin);
  n=strlen(t);
  m=strlen(s);
  prefix();
  kmp();
  fclose(fout);
  return 0;
}