Pentru această operație este nevoie să te autentifici.
Cod sursă (job #153230)
Utilizator |
|
IP | ascuns |
---|---|---|---|
Problemă | Bart (clasele 9-10) | Compilator | cpp | 0,74 kb |
Rundă | Arhiva de probleme | Status | evaluat |
Dată | 15 aug. 2015 17:31:23 | Scor | 100 |
#include <stdio.h>
#include <string.h>
#define MAX_N 500000
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#pragma warning(disable : 4996)
char s[MAX_N];
int z[MAX_N];
int main(void) {
FILE *f = fopen("bart.in", "r");
int lo, hi;
int n;
int i;
fscanf(f, "%s", s);
fclose(f);
n = strlen(s);
lo = 0;
hi = 0;
for (i = 1; i < n; i++) {
if (i <= hi) {
z[i] = MIN(hi - i + 1, z[i - lo]);
}
while (i + z[i] < n && s[z[i]] == s[i + z[i]]) {
z[i]++;
}
if (i + z[i] - 1 > hi) {
lo = i;
hi = i + z[i] - 1;
}
}
i = 1;
while (i < n && z[i] + i != n) {
i++;
}
s[i] = '\0';
f = fopen("bart.out", "w");
fputs(s, f);
fclose(f);
return 0;
}