Cod sursa(job #2976273)

Utilizator DavidbosDavid David Davidbos Data 8 februarie 2023 19:56:39
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.75 kb
#include <fstream>

using namespace std;
ifstream cin("strmatch.in");
ofstream cout("strmatch.out");
char a[2000001],b;
short int s[2000001];
long long nr1=1e+3,nr2=1e+7,nr3,nr4=0,nr5=0,nr6=0,nr7=0,x=1,y=1,j,aux;
int v[2000001];
int main()
{
    int n,m,i=0;
    cin>>a;
    ///cin>>b;

    for(j=0;a[j]!=NULL && a[j]!='\n';j++){
        if(a[j]>='A' && a[j]<='Z')
            nr3=a[j]-'A'+1;
        else
            if(a[j]>='a' && a[j]<='z')
                nr3=26+a[j]-'a'+1;
        else
           if(a[j]>='0' && a[j]<='9')
                nr3=52+a[j]-'0'+1;
        nr4*=62;
        nr5*=62;
        nr4+=nr3;
        nr5+=nr3;
        nr4%=nr1;
        nr5%=nr2;
        if(j!=0){
        x=x*62%nr1;
        y=y*62%nr2;
        }
    }

    while(cin>>b){
        if(b>='A' && b<='Z')
            nr3=b-'A'+1;
        else
            if(b>='a' && b<='z')
                nr3=26+b-'a'+1;
        else
           if(b>='0' && b<='9')
                nr3=52+b-'0'+1;
         s[i]=nr3;
        if(i>j-1){
        nr6+=nr1;
        nr7+=nr2;
        nr6-=(s[i-j]*x)%nr1;
        nr7-=(s[i-j]*y)%nr2;
        nr6=(nr6*62)%nr1;
        nr7=(nr7*62)%nr2;
        nr6+=nr3;
        nr7+=nr3;
        nr6%=nr1;
        nr7%=nr2;
        if(nr6==nr4 && nr7==nr5){
         aux++;
        v[aux]=i-j+1;
        }
        }
        else{
        nr6*=62;
        nr7*=62;
        nr6+=nr3;
        nr7+=nr3;
        nr6%=nr1;
        nr7%=nr2;
    if(nr6==nr4 && nr7==nr5)
        if(nr6==nr4 && nr7==nr5){
         aux++;
        v[aux]=i-j+1;
        }
        }

        i++;
    }
    cout<<aux<<'\n';
    if(aux>=1000)
        aux=1000;
    for(i=1;i<=aux;i++)
        cout<<v[i]<<" ";
    return 0;
}