#include <bits/stdc++.h>
//!===========================================================!//
//!  dP     dP                          dP                    !//
//!  88     88                          88                    !//
//!  88aaaaa88a .d8888b. .d8888b. .d888b88 .d8888b. 88d888b.  !//
//!  88     88  88ooood8 88'  '88 88'  '88 88ooood8 88'  '88  !//
//!  88     88  88.  ... 88.  .88 88.  .88 88.  ... 88        !//
//!  dP     dP  '88888P' '88888P8 '88888P8 '88888P' dP        !//
//!===========================================================!//
using ld = long double;
using ll = long long;
std::mt19937 mt{std::random_device{}()};
template <typename F>
constexpr F PI() { return 3.1415926535897932385; }
template <typename T, std::size_t N>
std::ostream& operator<<(std::ostream& os, const std::array<T, N>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename T, typename A>
std::ostream& operator<<(std::ostream& os, const std::deque<T, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename K, typename T, typename C, typename A>
std::ostream& operator<<(std::ostream& os, const std::multimap<K, T, C, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; }
    return (os << "]" << std::endl);
}
template <typename T, typename C, typename A>
std::ostream& operator<<(std::ostream& os, const std::multiset<T, C, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename K, typename T, typename C, typename A>
std::ostream& operator<<(std::ostream& os, const std::map<K, T, C, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; }
    return (os << "]" << std::endl);
}
template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::pair<T1, T2>& v) { return (os << "<" << v.first << "," << v.second << ">"); }
template <typename T1, typename T2, typename T3>
std::ostream& operator<<(std::ostream& os, const std::priority_queue<T1, T2, T3>& v)
{
    auto q = v;
    os << "[";
    while (not q.empty()) { os << q.top() << ",", q.pop(); }
    return os << "]\n";
}
template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::queue<T1>& v)
{
    auto q = v;
    os << "[";
    while (not q.empty()) { os << q.front() << ",", q.pop(); }
    return os << "]\n";
}
template <typename T, typename C, typename A>
std::ostream& operator<<(std::ostream& os, const std::set<T, C, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& os, const std::stack<T1>& v)
{
    auto q = v;
    os << "[";
    while (not q.empty()) { os << q.top() << ",", q.pop(); }
    return os << "]\n";
}
template <typename K, typename T, typename H, typename P, typename A>
std::ostream& operator<<(std::ostream& os, const std::unordered_multimap<K, T, H, P, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; }
    return (os << "]" << std::endl);
}
template <typename T, typename H, typename P, typename A>
std::ostream& operator<<(std::ostream& os, const std::unordered_multiset<T, H, P, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename K, typename T, typename H, typename P, typename A>
std::ostream& operator<<(std::ostream& os, const std::unordered_map<K, T, H, P, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << "<" << e.first << ": " << e.second << ">,"; }
    return (os << "]" << std::endl);
}
template <typename T, typename H, typename P, typename A>
std::ostream& operator<<(std::ostream& os, const std::unordered_set<T, H, P, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
template <typename T, typename A>
std::ostream& operator<<(std::ostream& os, const std::vector<T, A>& v)
{
    os << "[";
    for (const auto& e : v) { os << e << ","; }
    return (os << "]" << std::endl);
}
#define SHOW(...) (std::cerr << "(" << #__VA_ARGS__ << ") = ("), HogeHogeSansuu(__VA_ARGS__), std::cerr << ")" << std::endl;
void HogeHogeSansuu() { ; }
template <typename T>
void HogeHogeSansuu(const T x) { std::cerr << x; }
template <typename T, typename... Args>
void HogeHogeSansuu(const T x, Args... args) { (std::cerr << x << ", "), HogeHogeSansuu(args...); }
template <typename T>
std::vector<T> Vec(const std::size_t n, T v) { return std::vector<T>(n, v); }
template <class... Args>
auto Vec(const std::size_t n, Args... args) { return std::vector<decltype(Vec(args...))>(n, Vec(args...)); }
template <typename T>
constexpr T PopCount(T v) { return v = (v & 0x5555555555555555ULL) + (v >> 1 & 0x5555555555555555ULL), v = (v & 0x3333333333333333ULL) + (v >> 2 & 0x3333333333333333ULL), v = (v + (v >> 4)) & 0x0F0F0F0F0F0F0F0FULL, static_cast<T>(v * 0x0101010101010101ULL >> 56 & 0x7f); }
template <typename T>
constexpr T log2p1(T v) { return v |= (v >> 1), v |= (v >> 2), v |= (v >> 4), v |= (v >> 8), v |= (v >> 16), v |= (v >> 32), PopCount(v); }
template <typename T>
constexpr bool ispow2(const T v) { return (v << 1) == (T(1) << (log2p1(v))); }
template <typename T>
constexpr T ceil2(const T v) { return ispow2(v) ? v : T(1) << log2p1(v); }
template <typename T>
constexpr T floor2(const T v) { return v == 0 ? T(0) : ispow2(v) ? v : T(1) << (log2p1(v) - 1); }
//!===========================================================================================!//
//!   888888ba           dP dP oo                      dP     dP                    dP        !//
//!   88    '8b          88 88                         88     88                    88        !//
//!  a88aaaa8P' .d8888b. 88 88 dP 88d888b. .d8888b.    88aaaaa88a .d8888b. .d8888b. 88d888b.  !//
//!   88   '8b. 88'  '88 88 88 88 88'  '88 88'  '88    88     88  88'  '88 Y8ooooo. 88'  '88  !//
//!   88     88 88.  .88 88 88 88 88    88 88.  .88    88     88  88.  .88       88 88    88  !//
//!   dP     dP '88888P' dP dP dP dP    dP '8888P88    dP     dP  '88888P8 '88888P' dP    dP  !//
//!                                             .88                                           !//
//!                                         d8888P                                            !//
//!===========================================================================================!//
class RollingHash
{
public:
    template <typename InIt>
    RollingHash(const InIt first, const InIt last, const ll mod) : mod(mod), N((std::size_t)std::distance(first, last)), pow(N + 1, 1), hash(N + 1, 0)
    {
        const ll base = std::uniform_int_distribution<ll>{2, mod - 1}(mt);
        const std::size_t N = (std::size_t)(std::distance(first, last));
        for (std::size_t i = 1; i <= N; i++) { pow[i] = pow[i - 1] * base % mod, hash[i] = (hash[i - 1] * base + *std::next(first, i - 1)) % mod; }
    }
    ll getHash(const std::size_t l, const std::size_t r) const { return (mod + (hash[r] - hash[l] * pow[r - l]) % mod) % mod; }

private:
    const ll mod;
    const std::size_t N;
    std::vector<ll> pow, hash;
};
template <typename T>
constexpr T INF() { return std::numeric_limits<T>::max() / 4; }
//!============================================!//
//!    8888ba.88ba             oo              !//
//!    88  '8b  '8b                            !//
//!    88   88   88  .d8888b.  dP  88d888b.    !//
//!    88   88   88  88'  '88  88  88'  '88    !//
//!    88   88   88  88.  .88  88  88    88    !//
//!    dP   dP   dP  '88888P8  dP  dP    dP    !//
//!============================================!//
constexpr ll MOD = 1000000009;
int main()
{
    int N;
    std::string T;
    std::cin >> N >> T;
    auto R = T;
    std::reverse(R.begin(), R.end());
    const std::string TT = T + R;
    RollingHash Hash(TT.begin(), TT.end(), MOD);
    for (int L = 2; L < N; L += 2) {
        const auto hash = Hash.getHash(0, L);
        bool ok = true;
        for (int i = 1; (i + 1) * L <= N; i++) {
            const auto h2 = Hash.getHash(i * L, (i + 1) * L);
            if (h2 != hash) {
                ok = false;
                break;
            }
        }
        if (not ok) { continue; }
        ok = Hash.getHash(1, L / 2) == Hash.getHash(2 * N - L, 2 * N - 1 - L / 2);
        if (not ok) { continue; }
        const int RS = N / L * L;
        const int RT = N;
        const int RN = RT - RS;
        if (RS != N) { ok = Hash.getHash(0, RN) == Hash.getHash(RS, N); }
        if (ok) { return std::cout << L / 2 + 1 << std::endl, 0; }
    }
    for (int l = 1; l < N; l++) {
        if (2 * l - N - 1 < 0) { continue; }
        if (Hash.getHash(2 * l - N - 1, l - 1) == Hash.getHash(N, 2 * N - l)) { return std::cout << l << std::endl, 0; }
    }
    std::cout << N << std::endl;
    return 0;
}



Measured memory_bytes: 38336