Cod sursa(job #2324563)

Utilizator canmihaiCancescu Mihai canmihai Data 21 ianuarie 2019 00:20:07
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <fstream>
#include <vector>
#define d mm
using namespace std;
ifstream fin("cifru2.in");
ofstream fout("cifru2.out");
int nn,mm,v[200010],v2[200010],v3[100010],v4[100010],loc,q=11,f[10010];
vector<int> a;
//ArRaY sTaRtS aT 0
//pt un motiv oare si care nu mi mergea cand aveam cu 1
// pe principiul daca nu e stricat nu l atinge nu i mai fac nimica
void search(int txt[] , int pat[]){
    int m=nn,n=nn*2,i,j,p=0,t=0,h=1;
    for(i=0;i<m-1;i++)
        h=(d*h)%q;

    for(i=0;i<m;i++){
        p=(d*p+pat[i])%q;
        t=(d*t+txt[i])%q;
    }

    for(i=0;i<=n-m;i++){
        if(t==p){
            for(j=0;j<m;j++)
                if(txt[i+j]!=pat[j])
                    break;
        if(j==m&&loc==0)
           loc=i;
           break;
        }

        if(i<n-m){
            t=(d*(t-txt[i]*h)+txt[i+m])%q;

        if(t < 0)
            t=(t+q);
        }
    }
}

int main(){
    fin>>nn>>mm;
    for(int i=0;i<nn;i++){
        fin>>v[i];
        v[i+nn]=v[i];//text necodat
    }
    for(int i=0;i<nn;i++){
        fin>>v2[i];//text codat
        v2[i+nn]=v2[i];
    }
    for(int i=0;i<nn;i++){
        int j=i+1,cnt=1;
        while(v[j]!=v[i]&&j<=nn*2){
            j++;
            cnt++;
        }
        v3[i]=cnt; // trans text necoadt
    }
    for(int i=0;i<nn;i++){
        int j=i+1,cnt=1;
        while(v2[j]!=v2[i]&&j<=nn*2){
            j++;
            cnt++;
        }
        v4[i]=cnt;
        v4[nn+i]=cnt; //trans text codat
    }
    //pe v3 il caut in v4
    search(v4,v3);
    fout<<loc<<"\n";
    for(int i=loc;i<=nn+loc;i++){
        a.push_back(v2[i]);
       // cout<<v[i<<" ";
    }
    for(int i=0;i<a.size();i++){
        if(v[i]!=a[i])
            f[v[i]]=a[i];
       // cout<<a[i]<<" "<<v[i]<<endl;
    }
    for(int i=0;i<=mm;i++)
        if(f[i]!=0)
            fout<<f[i]<<" ";

    return 0;
}