#include<bits/stdc++.h>
//zone
//the joy you feel when you draw out 120 % of your potential :D
using namespace std;
int mincut(string str)
{
int n = str.length();
bool P[n][n];//for checking of pallindrome validation from i to j - 1
int c[n];
int i,j;
for(i = 0 ; i < n ; i++)
{
P[i][i] = true; // single word is itself a pallindrome
}
int L;
for(L = 2 ; L <=n ; L++)//checking for pallindromes for varying lengths of substring
{
for(i = 0 ; i < n - L + 1 ; i++)
{
j = i + L - 1; //ending index of substring
if(L == 2)
{
if(str[i] == str[j])
{
P[i][j] = true;
}
else
P[i][j] = false;
}
else
{// this means that if str[i] == str[j] and if all the characters within its are pallindrome
// than P[i][j] is pallindrome suppose for P[2][5] to be pallindrome then it is must for P[3][4]
//to be pallindrome and S[2] == S[5]
if(str[i] == str[j] && P[i + 1][j - 1] == true)
{
P[i][j] = true;
}
else
P[i][j] = false;
}
}
}
//now we will starting checking for cuts
for(i = 0 ; i < n ; i++)
{
if(P[0][i] == true) //if pallindrome 0 to i is true then pallindrome from 0 to i requires 0 mincuts
{
c[i] = 0;
}
else
{
c[i] = INT_MAX;
for(j = 0 ; j < i ; j++) // iterate over for all possibilities for cuts for substring 0 to i
{
if(P[j + 1][i] == true)
{
c[i] = min(c[i],1+c[j]);
}
}
}
}
return c[n-1]; // return total mincuts for 0 to n-1 length
}
int main()
{
string s;
cin >> s;
cout<<"Mincuts required\n";
cout<<mincut(s)<<endl;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KLy96b25lCi8vdGhlIGpveSB5b3UgZmVlbCB3aGVuIHlvdSBkcmF3IG91dCAxMjAgJSBvZiB5b3VyIHBvdGVudGlhbCA6RAp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbWluY3V0KHN0cmluZyBzdHIpCnsKICAgIGludCBuID0gc3RyLmxlbmd0aCgpOwogICAgYm9vbCBQW25dW25dOy8vZm9yIGNoZWNraW5nIG9mIHBhbGxpbmRyb21lIHZhbGlkYXRpb24gZnJvbSBpIHRvIGogLSAxCiAgICBpbnQgY1tuXTsKICAgIGludCBpLGo7CiAgICBmb3IoaSA9IDAgOyBpIDwgbiA7IGkrKykKICAgIHsKICAgICAgICBQW2ldW2ldID0gdHJ1ZTsgLy8gc2luZ2xlIHdvcmQgaXMgaXRzZWxmIGEgcGFsbGluZHJvbWUKICAgIH0KICAgIGludCBMOwogICAgZm9yKEwgPSAyIDsgTCA8PW4gOyBMKyspLy9jaGVja2luZyBmb3IgcGFsbGluZHJvbWVzIGZvciB2YXJ5aW5nIGxlbmd0aHMgb2Ygc3Vic3RyaW5nCiAgICB7CiAgICAgICAgZm9yKGkgPSAwIDsgaSA8IG4gLSBMICsgMSA7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGogPSBpICsgTCAtIDE7IC8vZW5kaW5nIGluZGV4IG9mIHN1YnN0cmluZwogICAgICAgICAgICBpZihMID09IDIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKHN0cltpXSA9PSBzdHJbal0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUFtpXVtqXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgUFtpXVtqXSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgey8vIHRoaXMgbWVhbnMgdGhhdCBpZiBzdHJbaV0gPT0gc3RyW2pdIGFuZCBpZiBhbGwgdGhlIGNoYXJhY3RlcnMgd2l0aGluIGl0cyBhcmUgcGFsbGluZHJvbWUKICAgICAgICAgICAgLy8gdGhhbiBQW2ldW2pdIGlzIHBhbGxpbmRyb21lIHN1cHBvc2UgZm9yIFBbMl1bNV0gdG8gYmUgcGFsbGluZHJvbWUgdGhlbiBpdCBpcyBtdXN0IGZvciBQWzNdWzRdCiAgICAgICAgICAgIC8vdG8gYmUgcGFsbGluZHJvbWUgYW5kIFNbMl0gPT0gU1s1XQogICAgICAgICAgICAgICAgaWYoc3RyW2ldID09IHN0cltqXSAmJiBQW2kgKyAxXVtqIC0gMV0gPT0gdHJ1ZSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBQW2ldW2pdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBQW2ldW2pdID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvL25vdyB3ZSB3aWxsIHN0YXJ0aW5nIGNoZWNraW5nIGZvciBjdXRzCiAgICBmb3IoaSA9IDAgOyBpICA8IG4gOyBpKyspCiAgICB7CiAgICAgICAgaWYoUFswXVtpXSA9PSB0cnVlKSAvL2lmIHBhbGxpbmRyb21lIDAgdG8gaSBpcyB0cnVlIHRoZW4gcGFsbGluZHJvbWUgZnJvbSAwIHRvIGkgcmVxdWlyZXMgMCBtaW5jdXRzCiAgICAgICAgewogICAgICAgICAgICBjW2ldID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgY1tpXSA9IElOVF9NQVg7CiAgICAgICAgICAgIGZvcihqID0gMCA7IGogPCBpIDsgaisrKSAvLyBpdGVyYXRlIG92ZXIgZm9yIGFsbCBwb3NzaWJpbGl0aWVzIGZvciBjdXRzIGZvciBzdWJzdHJpbmcgMCB0byBpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmKFBbaiArIDFdW2ldID09IHRydWUpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgY1tpXSA9IG1pbihjW2ldLDErY1tqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY1tuLTFdOyAvLyByZXR1cm4gdG90YWwgbWluY3V0cyBmb3IgMCB0byBuLTEgbGVuZ3RoCn0KaW50IG1haW4oKQp7CiAgICBzdHJpbmcgczsKICAgIGNpbiA+PiBzOwogICAgY291dDw8Ik1pbmN1dHMgcmVxdWlyZWRcbiI7CiAgICBjb3V0PDxtaW5jdXQocyk8PGVuZGw7CiAgICByZXR1cm4gMDsKfQo=