Cod sursa(job #2294266)

Utilizator canmihaiCancescu Mihai canmihai Data 2 decembrie 2018 07:51:04
Problema Potrivirea sirurilor Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include<stdio.h>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
char v1[2000010],v2[2000010],x;
int n,m=1,p=1,sum,valori[10000],s[2000010],sol[10100],nrs=1;
int main(){
    fin>>v1;
    n=strlen(v1);
    //m=strlen(v2);
    for(int i=0;i<n;i++){
        if(valori[v1[i]-'0']==0){
            valori[v1[i]-'0']=p;
            sum+=p;
            p++;
        }
        else
            sum+=valori[v1[i]-'0'];
    }
    while(fin>>v2[m]){
        if(valori[v2[m]-'0']!=0)
            s[m]=s[m-1]+valori[v2[m]-'0'];
        else
            s[m]=0;
        m++;
    }
    for(int i=1;i<=m-n;i++){
        if(s[i]!=0)
            if(s[i+n-1]-s[i]+1==sum){
                int q=1;
                for(int j=0;j<n;j++)
                    if(v2[i+j]==v1[j])
                   // if(i==969){
                      //  cout<<n<<" ";
                        q++;
                   // }
                    else
                        break;//cout<<i<<" "<<q<<" "<<nrs<<" ";
             //   cout<<i-1<<" "<<q<<" "<<n<<endl;
                if(q-1==n){
                    if(nrs<=1000){
                        sol[nrs]=i-1;
                        nrs++;
                    }
                    else
                        nrs++;
                }
            }

    }
    fout<<nrs-1<<"\n";
    for(int i=1;i<nrs;i++)
        if(i>1000)
            break;
        else
            fout<<sol[i]<<" ";



    return 0;
}