Pagini recente » Cod sursa (job #3123991) | Cod sursa (job #1970963) | Cod sursa (job #535313) | Cod sursa (job #1935481) | Cod sursa (job #1162621)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector <int> v;
char s[100010];
int n,i,nr,mij,dr,mij2,dr2,equiv,dp[200015],k;
int main(void)
{
FILE * f;
f=fopen("numarare.in","r");
ofstream g("numarare.out");
fscanf(f,"%d",&n);
fgets(s,2,f);
fgets(s,100005,f);
v.reserve(200015);
v.push_back(1000000000);
v.push_back(-1);
for (i=0;i<2*n;i=i+2)
{
nr=s[i];
v.push_back(nr);
v.push_back(-1);
}
v.push_back(1000000000);
for (i=3;i<2*n;i=i+2)
{
if (i>=mij+dr)
{
mij=i;
dr=1;
while (v[mij+dr+2]+v[mij-dr-2]==v[mij+dr]+v[mij-dr])
dr=dr+2;
dp[i]=dr;
}
else
{
equiv=2*mij-i;
mij2=i;
dr2=min(dr-(i-mij),dp[equiv]);
while (v[mij2+dr2+2]+v[mij2-dr2-2]==v[mij2+dr2]+v[mij2-dr2])
dr2=dr2+2;
dp[i]=dr2;
if (dr2>dr)
{
dr=dr2;
mij=mij2;
}
}
k=k+(dp[i]+1)/2;
}
g<<k<<'\n';
g.close();
return 0;
}