Cod sursa(job #901003)

Utilizator rootsroots1 roots Data 28 februarie 2013 23:33:38
Problema Prefix Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <string>
#include <vector>

using namespace std;

ifstream cin;
ofstream cout;

string s;
vector < int > pre;

int main()
{
    cin.open("prefix.in");
    cout.open("prefix.out");

    int T;
    cin >> T;
    cin.ignore();

    while(T -- )
    {
        getline(cin, s);

        pre.clear();
        pre.push_back( - 1);

        int q = - 1;
        for(int i = 1; i < s.size(); ++ i)
        {
            while(q > - 1 && s[q + 1] != s[i]) q = pre[q];
            if(s[q + 1] == s[i]) ++ q;
            pre.push_back(q);
        }

        /*
        for(int i = 0; i < s.size(); ++ i) cout << pre[i] + 1 << ' ';
        cout << '\n';
        */

        int sol = 0;
        for(int i = s.size() - 1; i > 0; -- i)
        {
            int a, b, d;

            a = i;
            b = pre[i];
            d = a - b;

            if(b == - 1) continue;

            while(d == a - b && b != - 1)
            {
                a = b;
                while(d > a - b && b != - 1) b = pre[b];
            }

            if(b == - 1 && d == a - b)
            {
                sol = i + 1;
                break;
            }
        }
        cout << sol << '\n';
    }

    cin.close();
    cout.close();

    return 0;
}