Submission #1171405

#TimeUsernameProblemLanguageResultExecution timeMemory
1171405freezecodePalindromic Partitions (CEOI17_palindromic)C++20
0 / 100
0 ms320 KiB
#include <iostream>
#include <vector> 
#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <queue>
#include <unordered_set>
#include <sstream>
#include <cstdint>
#include <unordered_map>
#define nl '\n'
#define ll long long
#define COLOR_RESET "\033[0m"
#define COLOR_BLUE "\033[34m"
#define COLOR_GREEN "\033[32m"
using namespace std;

struct triple {
    int x;
    int y;
    int z;

    triple() {};
    triple(int x, int y, int z) : x(x), y(y), z(z) {};
};

std::ostream& operator<<(std::ostream& s, const pair<int, int>& t) { 
    s << "(" << t.first << ", " << t.second << ")";
    return s;
}

std::ostream& operator<<(std::ostream& s, const triple& t) { 
    s << "(" << t.x << ", " << t.y << ", " << t.z << ")";
    return s;
}

template<typename T>
std::ostream& operator<<(std::ostream& s, const std::vector<T>& t) { 
    int last = t.size() - 1;
    s << "[";
    for (int i = 0; i < t.size(); i++) {
        s << t[i];
        if (i != last) {
            s << ", ";
        }
    }
    return s << "]";
}

template<typename T, typename K>
std::ostream& operator<<(std::ostream& s, const pair<T, K>& t) { 
    s << "(" << t.first << ", " << t.second << ")";
    return s;
}

string arrToString(int* arr, int size) {
    std::ostringstream result;  
    result << "[";              
    for (int i = 0; i < size; ++i) {
        result << arr[i];       
        if (i != size - 1) {
            result << ", ";   
        }
    }
    result << "]";              
    return result.str(); 
}

ll binpow(ll a, ll b, const int MOD) {
    ll res = 1;
    while (b > 0) {
        if (b & 1)
            res = res * a % MOD;
            res %= MOD;
        a = a % MOD * a % MOD;
        a %= MOD;
        b >>= 1;
    }
    return res % MOD;
}

bool isPrime(int k) {
    if (k == 1) {
        return false;
    }
    for (int i = 2; i * i <= k; i++) {
        if (k % i == 0) {
            return false;
        }
    }
    return true;
}

ll compute_hash(string const& s, const int P, const int MOD) {
    ll hash_value = 0;
    ll p_pow = 1;
    for (char c : s) {
        hash_value = (hash_value + (c - 'a' + 1) * p_pow) % MOD;
        p_pow = (p_pow * P) % MOD;
    }
    return hash_value;
}
 
int gcd(int a, int b, int& x, int& y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int x1, y1;
    int d = gcd(b, a % b, x1, y1);
    x = y1;
    y = x1 - y1 * (a / b);
    return d;
}
 
int mod_inverse(int a, const int MOD) {
    int x, y;
    int g = gcd(a, MOD, x, y);
    x = (x % MOD + MOD) % MOD;
    return x;
}


void compute_power_inverses(vector<ll>& inv, ll p, const int MOD) {
    inv[0] = 1;
    inv[1] = mod_inverse(p, MOD);
    for (int i = 2; i < inv.size(); i++) {
        inv[i] = inv[i - 1] * inv[1] % MOD;
    }
}

struct string_hash {
    const int P[3] = {31, 33, 53};
    const int MOD[3] = {(int) 1e9 + 7, (int) 1e9 + 9, (int) 1e9 + 39};
    int inv[3];
    ll pow[3] = {1, 1, 1};
    ll hash_values[3] = {0, 0, 0};

    string_hash() {
        for (int i = 0; i < 3; i++) {
            inv[i] = mod_inverse(P[i], MOD[i]);
        }
    }

    bool operator==(string_hash& h) {
        return hash_values[0] == h.hash_values[0] && hash_values[1] == h.hash_values[1] && hash_values[2] == h.hash_values[2];
    }

    void removeFirst(char c) {
        for (int i = 0; i < 3; i++) {
            hash_values[i] = (((hash_values[i] - (c - 'a' + 1) * pow[i]) % MOD[i]) + MOD[i]) % MOD[i];
            pow[i] = pow[i] * inv[i] % MOD[i];
        }
    }

    void removeLast(char c) {
        for (int i = 0; i < 3; i++) {
            hash_values[i] = (((hash_values[i] - (c - 'a' + 1)) % MOD[i]) + MOD[i]) % MOD[i];
            hash_values[i] = hash_values[i] * inv[i] % MOD[i];
            pow[i] = pow[i] * inv[i] % MOD[i];
        }
    }

    void addFirst(char c) {
        for (int i = 0; i < 3; i++) {
            pow[i] = pow[i] * P[i] % MOD[i];
            hash_values[i] += (c - 'a' + 1) * pow[i];
        }
    }

    void addLast(char c) {
        for (int i = 0; i < 3; i++) {
            pow[i] = pow[i] * P[i] % MOD[i];
            hash_values[i] = (hash_values[i] * P[i] % MOD[i] + (c - 'a' + 1) * P[i]) % MOD[i];
        }
    }   

    void clear() {
        for (int i = 0; i < 3; i++) {
            hash_values[i] = 0;
            pow[i] = 1;
        }
    }
};

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    const ll MOD = 1e9+7;
    const ll MOD2 = 1e9+9;

    int t;
    cin >> t;
    const int P1 = 31;
    const int P2 = 33;
    while (t--) {
        string s;
        cin >> s;
        int len = s.size();
        int l = 0, r = len - 1;
        string_hash prefix_hash, suffix_hash;
        int count = 1;
        while (l < r) {
            prefix_hash.addLast(s[l]);
            suffix_hash.addFirst(s[r]);
            if (prefix_hash == suffix_hash) {
                count += 2;
                prefix_hash.clear();
                suffix_hash.clear();
                if (l == r - 1) {
                    count--;
                }
            }
            l++; r--;
        }
        cout << count << nl;
    }
}
    
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...