Cod sursa(job #1050313)

Utilizator LizzardStanbeca Theodor-Ionut Lizzard Data 8 decembrie 2013 14:45:26
Problema Patrate 3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <vector>
#define _h 131
#define _H 666013
using namespace std;

ifstream fin ("map.in");
ofstream fout ("map.out");

void build(char [], vector <int> &, int );
void cb(int , int , vector <vector <int> > , int , int , int &);

int main()
{
    char b[2001];
    int n,m,i;
    vector< vector <int> > hash;

    fin>>n>>m;
    hash.resize(n+1);
    fin.get();
    for(i=1;i<=n;i++)
    {
        hash[i].resize(m+1);
        fin.get(b,2000);
        fin.get();
        build(b,hash[i],m);
    }
    for(i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
                fout<<hash[i].at(j)<<" ";
        fout<<"\n";
    }

    int r=0;
    cb(1,m/2,hash,n,m,r);
    fout<<m-r+1;

    return 0;
}

void cb(int li, int ls, vector <vector <int> > hash, int n, int m, int &r)
{
    if(li>ls)  return;

    int mij=(li+ls)/2,ok=1;
    for(int i=1;i<=n && ok;i++)
        if(hash[i].at(mij)!=hash[i].at(m-mij+1))    ok=0;
    if(ok)
    {
        r=mij;
        return cb(mij+1,ls,hash,n,m,r);
    }
    else
        return cb(li,mij-1,hash,n,m,r);
}

void build(char s[], vector <int> &v, int n)
{
    int i,c,t=n/2+1;
    for(i=1,c=1;i<t;i++)
    {
        c=_h*c+s[i-1];
        if(c>_H)    c%=_H;
        v[i]=c;
    }
    for(i=n,c=1;i>=t;i--)
    {
        c=_h*c+s[i-1];
        if(c>_H)    c%=_H;
        v[i]=c;
    }
}