Cod sursa(job #1724113)

Utilizator antanaAntonia Boca antana Data 2 iulie 2016 12:59:57
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include<string.h>
#define MOD1 33554431
#define MOD2 524287
#define MAX 5000
#define b 30
#define litera(x) (x-'a'+1)
using namespace std;
int v1[MAX+1], v2[MAX+1], put1[MAX+1];
char s[MAX+1];
int main()
{
    freopen("triopalindrom.in", "r", stdin);
    freopen("triopalindrom.out", "w", stdout);
    int n, nrsecv=0, lim;
    long long nr1=0;
    gets(s), n=strlen(s);
    put1[0]=1;
    lim=n/3;
    for(int i=1;i<=n;++i)
        put1[i]=(put1[i-1]*b)&MOD1;
    for(int k=1;k<=lim;++k)
    {
        int i=0;
        nr1=0;
        while(i<k)
        {
            nr1=(((nr1*b)&MOD1) + s[i])&MOD1;
            ++i;
        }
        v1[i-1]=nr1;
        for(;i<n;++i)
        {
            nr1=nr1-((s[i-k]*put1[k-1])&MOD1);
            if(nr1 < 0) nr1+=MOD1;
            nr1=(((nr1*b)&MOD1) + s[i])&MOD1;
            v1[i]=nr1;
        }
        for(i=2*k-1;i<n-k;++i)
            if(v1[i-k]==v1[i] && v1[i]==v1[i+k])
                    nrsecv++;
        for(i=0;i<n;++i)
            v1[i]=-1;
    }
    printf("%d", nrsecv);
    return 0;
}