Cod sursa(job #1836948)

Utilizator Bodo171Bogdan Pop Bodo171 Data 28 decembrie 2016 21:11:42
Problema Potrivirea sirurilor Scor 32
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int mod1=10000003;
const int mod2=10000007;
const int alpha=52;
vector<int> ans;
string a,b;
int put1,put2,m1,m2,c1,c2,i,len;
inline int conv(char c)
{
    if(c>='A'&&c<='Z') return (26+c-'A');
    return (c-'a');
}
int main()
{
    ifstream f("strmatch.in");
    ofstream g("strmatch.out");
    f>>a>>b;put1=1;put2=1;
    for(i=0;i<a.size();i++)
    {
        m1=(m1*alpha+conv(a[i]))%mod1;
        m2=(m2*alpha+conv(a[i]))%mod2;
        put1=(put1*alpha)%mod1;
        put2=(put2*alpha)%mod2;
    }
    len=a.size();
    for(i=0;i<b.size();i++)
    {
         c1=(c1*alpha+conv(b[i]))%mod1;
         c2=(c2*alpha+conv(b[i]))%mod2;
         if(i>=len)
         {
             c1-=(put1*conv(b[i-len]))%mod1;
             c2-=(put2*conv(b[i-len]))%mod2;
             if(c1<0) c1+=mod1;
             if(c2<0) c2+=mod2;
         }
         if(i>=len-1)
         {
             cout<<m1<<' '<<c1<<'\n';
             if(m1==c1&&m2==c2)
                ans.push_back(i-len+1);
         }
    }
    g<<ans.size()<<'\n';
    for(i=0;i<min((int)ans.size(),1000);i++)
        g<<ans[i]<<' ';
    return 0;
}