Pagini recente » Cod sursa (job #2842616) | Cod sursa (job #1817842) | Cod sursa (job #1096965) | Cod sursa (job #286532) | Cod sursa (job #807914)
Cod sursa(job #807914)
#include <fstream>
#include <cstring>
#define MAX 2000005
using namespace std;
char aux[MAX], sir[MAX];
int dp[MAX], n, L, R, C, lgt;
long long rez = 1;
int main()
{
ifstream in("pscpld.in"); in>>aux; in.close();
lgt = strlen(aux);
for(int i = 0; i < lgt; i++)
{
sir[++n] = aux[i];
if(i != lgt - 1) sir[++n] = '#';
}
dp[1] = 1; C = L = R = 1;
for(int i = 2; i <= n; i++)
{
dp[i] = max(min(dp[2 * C - i], C + dp[C] - i), 1);
L = i - dp[i];
R = i + dp[i];
while(L && R <= n && sir[L] == sir[R])
L--, R++, dp[i]++;
if(sir[i] == '#') rez += dp[i] / 2;
else rez += (dp[i] + 1) / 2;
if(i + dp[i] > C + dp[C]) C = i;
}
ofstream out("pscpld.out"); out<<rez; out.close();
return 0;
}