Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- vector<vector<int>> dp;
- vector<vector<int>> pos;
- vector<ll> p;
- vector<ll> h;
- string s;
- const ll mod = 1e9 + 7;
- int solve(int l, int r){
- int a = s[r] - 'a';
- int left = 0;
- int right = pos[a].size();
- while(right - left > 1){
- int m = (left + right) / 2;
- if(pos[a][m] >= l){
- right = m;
- }
- else{
- left = m;
- }
- }
- if(pos[a][left] >= l)
- right = left;
- for(int i = right; i < pos[a].size(); ++i){
- if(pos[a][i] >= l && pos[a][i] < (l + r + 1) / 2){
- int len = pos[a][i] - l + 1;
- ll h1 = h[l + len - 1] + mod;
- if(l - 1 >= 0)
- h1 -= h[l - 1];
- ll h2 = h[r] + mod - h[r - len];
- if((h1 * p[r - len + 1 - l]) % mod == h2 % mod)
- return(len);
- }
- }
- return 0;
- }
- int f(int l, int r){
- if(l == r){
- return 1;
- }
- if(dp[l][r] != 0){
- return(dp[l][r]);
- }
- int x = solve(l, r);
- if(x == 0){
- dp[l][r] = r - l + 1;
- }
- else{
- dp[l][r] = min(f(l + x, r), f(l, r - x));
- }
- return(dp[l][r]);
- }
- int main() {
- cin >> s;
- if(s.size() == 1){
- cout << 1 << endl;
- return 0;
- }
- int n = s.size();
- h.resize(n);
- p.resize(n);
- pos.resize(26, vector<int>());
- for(int i = 0; i < n; ++i){
- pos[s[i] - 'a'].push_back(i);
- }
- h[0] = (s[0] - 'a' + 1);
- p[0] = 1 * 1LL;
- for(int i = 1; i < n; ++i){
- p[i] = p[i - 1] * 29 * 1LL;
- p[i] %= mod;
- }
- for(int i = 1; i < n; ++i){
- h[i] = h[i - 1] + (s[i] - 'a' + 1) * p[i] * 1LL;
- h[i] %= mod;
- }
- dp.resize(s.size(), vector<int>(s.size()));
- f(0, s.size() - 1);
- cout << dp[0][s.size() - 1] << "\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement