#include<iostream>
#include<map>
#include<string>
#include<fstream>

int main()
{
    std::ifstream input("ulaz3.txt");
    std::string ulaz;
    input >> ulaz;
    int len = ulaz.length();
    int l_granica = 0;
    int d_granica = len-1;

    while((l_granica < d_granica) && (ulaz[l_granica] == ulaz[d_granica]))
    {
        l_granica++;
        d_granica--;
    }
    if(l_granica >= d_granica)
    {
        std::cout << "1";
        return 0;
    }

    std::map<char, int> char_count;
    for(int i = l_granica; i <= d_granica; i++)
        char_count[ulaz[i]]++;

    char odd = 0;   //Karakter koji se pojavljuje neparan broj puta
    for(auto& memb : char_count)
    {
        if(memb.second & 1)
            odd = memb.first;
    }

    std::map<char, int> chars_needed;   //Koliko je puta karakter potreban kako bi se od podstringa mogao napraviti palindrom

    for(auto& memb : char_count)
    {
        chars_needed[memb.first] = memb.second/2;
    }

    int middle = len/2;
    bool odd_in_middle = false; //Da li se na sredini nalazi karakter koji se pojavljuje neparan broj puta
    if(odd != 0)
    {
        if(ulaz[middle] == odd)
        {
            odd_in_middle = true;
        }
        else
            chars_needed[odd]++;
    }
        
    int ignore_portion_l = len;   //Ukoliko je sredina simetricna, mozemo je izignorisati
    int ignore_portion_r = -1;


    if(((len & 1) == 0) || (odd_in_middle == true))
    {
        ignore_portion_l = middle;
        ignore_portion_r = middle;
        
        if((len & 1) == 0)
            ignore_portion_l--;
            
        while(ulaz[ignore_portion_l] == ulaz[ignore_portion_r])
        {
            ignore_portion_l--;
            ignore_portion_r++;
        }
        for(int i = ignore_portion_l + 1; i < middle; i++)
            chars_needed[ulaz[i]]--;
    }


    std::map<char, int> nadjeni_karakteri;

    //Trazenje najkraceg podstringa pocev od leve strane
    int l_velicina = 0;
    int l_pocetak = l_granica;
    //Ukoliko imamo karakter koji se pojavljuje neparan broj puta, onda cemo uvek morati da predjemo preko sredine
    if(odd_in_middle == false && odd != 0)
    {
        for(int i = l_granica; i < middle; i++)
            nadjeni_karakteri[ulaz[i]]++;
        l_pocetak = middle;
    }

    for(int i = l_pocetak; i <= d_granica; i++)
    {

        if((i >= middle) && (i < ignore_portion_r))
            continue;
        else
            nadjeni_karakteri[ulaz[i]]++;


        bool gotovo = true;
        for(auto& memb : chars_needed)
            if(nadjeni_karakteri[memb.first] < memb.second)
            {
                gotovo = false;
                break;
            }
        if(gotovo)
        {
            l_velicina = i - l_granica + 1;
            break;
        }

    }

    nadjeni_karakteri.clear();
    int d_velicina = 0;
    int d_pocetak = len-1;
    if(odd_in_middle == false && odd != 0)
    {
        for(int i = d_granica; i > middle; i--)
            nadjeni_karakteri[ulaz[i]]++;
        d_pocetak = middle;
    }

    for(int i = d_pocetak; i >= l_granica; i--)
    {

        if((i > ignore_portion_l) && (i < middle))
            continue;
        else
            nadjeni_karakteri[ulaz[i]]++;

        bool gotovo = true;
        for(auto& memb : chars_needed)
            if(nadjeni_karakteri[memb.first] < memb.second)
            {
                gotovo = false;
                break;
            }
        if(gotovo)
        {
            d_velicina = d_granica - i + 1;
            break;
        }
    }

    int najbrzi = (d_velicina < l_velicina)? d_velicina : l_velicina;
    int odgovor = (najbrzi > 1) ? najbrzi : 1;

    for(auto& memb : chars_needed)
        std::cout << memb.first << " - " << memb.second << "\n";

    std::cout << ignore_portion_l << ", " << ignore_portion_r << "\n";
    std::cout << l_granica << ", " << d_granica << "\n";
    std::cout << l_velicina << ", " << d_velicina << "\n";

    std::cout << odgovor;

    return 0;
}