Cod sursa(job #856630)

Utilizator toranagahVlad Badelita toranagah Data 16 ianuarie 2013 20:03:50
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

const int MAX_N = 1000100;

ifstream fin("prefix.in");
ofstream fout("prefix.out");

int T;
string pattern;
int N;
int prefix[MAX_N];

void solve();
void compute_prefix(const string pattern);

int main() {
    solve();
    return 0;
}

void solve() {
    fin >> T;
    fin.ignore();
    for (int k = 1; k <= T; ++k) {
        getline(fin, pattern);
        N = pattern.size();
        pattern = ' ' + pattern;
        compute_prefix(pattern);
        int i;
        for (i = N; i > 0; --i) { 
            if ((prefix[i] > 0) && (i % (i - prefix[i]) == 0)) {
                fout << i  << '\n';
                break;
            }
        }
        if (i == 0) fout << 0 << '\n';
    }
}

void compute_prefix(const string pattern) {
    prefix[1] = 0;
    int p = 0;
    for (int i = 2; i <= N; ++i) {
        while (p > 0 && pattern[p+1] != pattern[i]) p = prefix[p];
        if (pattern[p+1] == pattern[i]) ++p;
        prefix[i] = p;
    }
}