Iamtui1010

countpl

Dec 1st, 2021
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.55 KB | None | 0 0
  1. //#include<bits/stdc++.h>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<vector>
  5.  
  6. #define long long long
  7. #define nln '\n'
  8.  
  9. const long N = 1e3;
  10.  
  11. using namespace std;
  12.  
  13. fstream f1, f2;
  14.  
  15. inline void openf()
  16. {
  17.     f1.open("palin.inp", ios:: in);
  18.     f2.open("palin.out", ios:: out);
  19. }
  20.  
  21. inline void closef()
  22. {
  23.     f1.close();
  24.     f2.close();
  25. }
  26.  
  27. string str;
  28.  
  29. void data()
  30. {
  31.     f1.tie(0)->sync_with_stdio(0);
  32.     f2.tie(0)->sync_with_stdio(0);
  33.     cin >> str;
  34. }
  35.  
  36. vector<long> odd, eve;
  37.  
  38. void build(bool opt, long k, long i, long j)
  39. {
  40.     if (opt)
  41.     {
  42.         ++odd[k];
  43.         --i; ++j;
  44.     }
  45.     while (i >= 0 && j < (long)str.size() && str[i] == str[j])
  46.     {
  47.         if (opt)
  48.             odd[k] += 2;
  49.         else
  50.             eve[k] += 2;
  51.         --i; ++j;
  52.     }
  53. }
  54.  
  55. void build_check()
  56. {
  57.     odd.resize(str.size(), 0);
  58.     eve.resize(str.size(), 0);
  59.     for (long i = 0; i != (long)str.size(); ++i)
  60.     {
  61.         build(1, i, i, i);
  62.         if (i < (long)str.size()-1)
  63.             build(0, i, i, i+1);
  64.     }
  65. }
  66.  
  67. bool check(long i, long j)
  68. {
  69.     long len = j-i+1;
  70.     bool res;
  71.     if (len % 2 == 1)
  72.         res = odd[(i+j)/2] >= len;
  73.     else
  74.         res = eve[(i+j)/2] >= len;
  75.     return res;
  76. }
  77.  
  78. vector<long> dp;
  79.  
  80. void process()
  81. {
  82.     build_check();
  83.     dp.resize(str.size(), N);
  84.     for (long i = 0; i != (long)str.size(); ++i)
  85.     {
  86.         if (check(0, i))
  87.         {
  88.             dp[i] = 1;
  89.             continue;
  90.         }
  91.  
  92.         dp[i] = dp[i-1] + 1;
  93.         for (long j = 1; j < i; ++j)
  94.             if (check(j, i) && dp[j-1]+1 < dp[i])
  95.                 dp[i] = dp[j-1]+1;
  96.     }
  97. }
  98.  
  99. void view()
  100. {
  101.     cout << dp[str.size()-1] << nln;
  102. }
  103.  
  104. int main()
  105. {
  106.     openf();
  107.     data();
  108.     process();
  109.     view();
  110.     closef();
  111.     return 0;
  112. }
  113.  
Advertisement
Add Comment
Please, Sign In to add comment