Guest User

Untitled

a guest
Apr 8th, 2020
506
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std ;
  3.  
  4. #define M 1000000007
  5. #define MM 998244353
  6. #define ll long long
  7. #define pb push_back
  8. #define mem0(a) memset(a,0,sizeof(a))
  9. #define mem1(a) memset(a,-1,sizeof(a))
  10. #define memf(a) memset(a,false,sizeof(a))
  11. #define all(v) v.begin(),v.end()
  12. #define sz(a) (ll)a.size()
  13. #define F first
  14. #define S second
  15. #define PI 3.1415926536
  16. #define INF 2e18
  17. #define endl "\n"
  18. #define llevel 20
  19. ll power(ll b,ll e,ll m)
  20. {
  21. if(e==0) return 1;
  22. if(e&1) return b*power(b*b%m,e/2,m)%m;
  23. return power(b*b%m,e/2,m);
  24. }
  25. ll power( ll b, ll e)
  26. {
  27. if(e==0) return 1;
  28. if(e&1) return b*power(b*b,e/2);
  29. return power(b*b,e/2);
  30. }
  31. ll n;
  32. string str;
  33. const int N=800;
  34. ll dp[N][N],ans[N][N];
  35. vector<int> zFunction(string &s)
  36. {
  37. int n=sz(s),l,r,i;
  38. vector<int> z(n);
  39. z[0]=n;
  40. l=r=0;
  41. for(i=1;i<n;++i)
  42. {
  43. if(i<=r)
  44. z[i]=min(r-i+1,z[i-l]);
  45. while(i+z[i]<n && s[z[i]]==s[z[i]+i])
  46. ++z[i];
  47. if(i+z[i]-1>r)
  48. {
  49. l=i;r=i+z[i]-1;
  50. }
  51. }
  52. return z;
  53. }
  54. ll calc(string s)
  55. {
  56. vector<int> vv=zFunction(s);
  57. ll kk=sz(s);
  58. ll ans=kk;
  59. for(ll i=1;i<kk;++i)
  60. {
  61. if(kk%i==0 && i+vv[i]==kk)
  62. ans=min(ans,i);
  63. }
  64. return ans;
  65. }
  66.  
  67. ll getans(ll i,ll j)
  68. {
  69. if(i==j)
  70. return 1;
  71. if(ans[i][j]!=-1)
  72. return ans[i][j];
  73. if(dp[i][j]<j-i+1)
  74. {
  75. return ans[i][j]=getans(i,i+dp[i][j]-1);
  76. }
  77. ll ret=j-i+1;
  78. for(ll kk=i;kk<j;++kk)
  79. {
  80. ret=min(getans(i,kk)+getans(kk+1,j),ret);
  81. }
  82. return ans[i][j]=ret;
  83. }
  84. int _runtimeTerror_()
  85. {
  86. ll i,j;
  87. cin>>n>>str;
  88. mem1(ans);
  89. for(i=0;i<n;++i)
  90. {
  91. for(j=i;j<n;++j)
  92. {
  93. if(j==i)
  94. {
  95. dp[i][j]=1;continue;
  96. }
  97. string t=str.substr(i,j-i+1);
  98. dp[i][j]=calc(t);
  99. }
  100. }
  101. cout<<getans(0,n-1);
  102. return 0;
  103. }
  104.  
  105. int main()
  106. {
  107. ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  108. #ifdef runSieve
  109. sieve();
  110. #endif
  111. #ifdef NCR
  112. initialize();
  113. #endif
  114. int TESTS=1;
  115. //cin>>TESTS;
  116. while(TESTS--)
  117. _runtimeTerror_();
  118. return 0;
  119. }
Add Comment
Please, Sign In to add comment