Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<bits/stdc++.h>
- #include<iostream>
- #include<fstream>
- #include<vector>
- #define long long long
- #define nln '\n'
- const long N = 1e3;
- using namespace std;
- fstream f1, f2;
- inline void openf()
- {
- f1.open("palin.inp", ios:: in);
- f2.open("palin.out", ios:: out);
- }
- inline void closef()
- {
- f1.close();
- f2.close();
- }
- string str;
- void data()
- {
- f1.tie(0)->sync_with_stdio(0);
- f2.tie(0)->sync_with_stdio(0);
- cin >> str;
- }
- vector<long> odd, eve;
- void build(bool opt, long k, long i, long j)
- {
- if (opt)
- {
- ++odd[k];
- --i; ++j;
- }
- while (i >= 0 && j < (long)str.size() && str[i] == str[j])
- {
- if (opt)
- odd[k] += 2;
- else
- eve[k] += 2;
- --i; ++j;
- }
- }
- void build_check()
- {
- odd.resize(str.size(), 0);
- eve.resize(str.size(), 0);
- for (long i = 0; i != (long)str.size(); ++i)
- {
- build(1, i, i, i);
- if (i < (long)str.size()-1)
- build(0, i, i, i+1);
- }
- }
- bool check(long i, long j)
- {
- long len = j-i+1;
- bool res;
- if (len % 2 == 1)
- res = odd[(i+j)/2] >= len;
- else
- res = eve[(i+j)/2] >= len;
- return res;
- }
- vector<long> dp;
- void process()
- {
- build_check();
- dp.resize(str.size(), N);
- for (long i = 0; i != (long)str.size(); ++i)
- {
- if (check(0, i))
- {
- dp[i] = 1;
- continue;
- }
- dp[i] = dp[i-1] + 1;
- for (long j = 1; j < i; ++j)
- if (check(j, i) && dp[j-1]+1 < dp[i])
- dp[i] = dp[j-1]+1;
- }
- }
- void view()
- {
- cout << dp[str.size()-1] << nln;
- }
- int main()
- {
- openf();
- data();
- process();
- view();
- closef();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment