Cod sursa(job #192707)

Utilizator raduzerRadu Zernoveanu raduzer Data 31 mai 2008 13:27:13
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <stdio.h>   
#include <string.h>   
  
int n,m,k,i,j,t,a[2000005],b[2000005],q,c[1005];  
char x;   
  
int main()   
{   
    freopen("strmatch.in","r",stdin);   
    freopen("strmatch.out","w",stdout);   
    k=0;   
    while (1)   
    {   
        scanf("%c",&x);   
        if (x=='\n') break;   
        ++k;   
        if (x>='0' && x<='9') b[k]=b[k-1]+(x-'0');   
        if (x>='A' && x<='Z') b[k]=b[k-1]+(x-'A')+10;   
        if (x>='a' && x<='z') b[k]=b[k-1]+(x-'a')+10+26;   
    }   
    n=0;   
    while (1)   
    {   
        scanf("%c",&x);   
        if (x=='\n') break;   
        ++n;   
        if (x>='0' && x<='9') a[n]=a[n-1]+(x-'0');   
        if (x>='A' && x<='Z') a[n]=a[n-1]+(x-'A')+10;   
        if (x>='a' && x<='z') a[n]=a[n-1]+(x-'a')+10+26;   
    }   
    int sol=0;   
    for (i=k; i<=n; ++i)   
        if (b[k]==a[i]-a[i-k])   
        {   
            q=1;   
            for (j=1; j<=k; ++j) if (b[j]!=a[i-k+j]-a[i-k]) { q=0; break; }   
            if (q) ++sol;   
            if (q && sol<=1000) c[sol]=i-k;   
        }   
    printf("%d\n",sol);   
	for (i=1; i<=sol; ++i) { if (i>1000) break; printf("%d ",c[i]); }
    return 0;   
}