#include <bits/stdc++.h>
#include <sstream>
#define ll long long
#define fr(i,j,p) for(int i=j; i<p ;i++)
#include <stdio.h>
# define M_PI 3.14159265358979323846
//memset(b,0,sizeof(b[0][0])*100001*5);
//std::cout << std::fixed << std::setprecision(7) << m;
//tuple
//int s1=0,l=0;
//ll md=1000000007;
//ll dp[100005];
//set<ll> st1; set<ll> st2;
//int b[100005][32];
int dp[27][100005];
using namespace std;
vector<int>v[27];
//vector<int>c;
int main()
{
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
ios::sync_with_stdio(0);
string s; cin>>s;
memset(dp,0,sizeof(dp[0][0])*27*100005);
int l=s.length();
fr(i,0,27) {v[i].push_back(l);}
for(int i=l-1;i>=0;i--)
{
fr(j,0,26) {dp[(s[i]-'a')][i]=dp[(s[i]-'a')][i+1];}
dp[(s[i]-'a')][i]=dp[(s[i]-'a')][i+1]+1;
}
int mx=0;
fr(i,0,26) mx=max(mx,dp[i][0]);
fr(i,0,26)
{
fr(j,0,26)
{
if(i==j) continue;
int x=0;
fr(k,0,s.length())
{
if(dp[i][k]==0 && dp[i][k]==dp[i][k+1]) continue;
x=x+dp[j][k];
}
mx=max(mx,x);
}
}
cout<<mx<<endl;
fr(i,0,26)
{fr(j,0,l) {cout<<dp[i][j]<<" ";} cout<<endl;}
return 0;
}
/*int n,m,k;
cin>>n>>m>>k;
int aa=k;
int d[n];
fr(i,0,n)
{
cin>>a[i]>>b[i]>>c[i];
d[i]=aa-a[i];
if(d[i]<0) {cout<<-1; break;}
aa=aa+b[i];
}
int mn[n];
mn[n-1]=d[n-1];
for(int i=n-2;i>=0,i--)
{
if(d[i]<mn[i+1]) {mn[i]=d[i];}
else mn[i]=mn[i+1];
}
pair<int,int>p[m];
fr(i,0,m) {cin>>p[i].first>>p[i].second;}
sort(p,p+m);*/
/*int n,c=0;
double sum=0.000;
cin>>n;
double a[2*n];
fr(i,0,2*n)
{
cin>>a[i];
int x=a[i];
double y=a[i]-x;
if(y==0) c++;
sum=sum+y;
}
c=c/2;
cout<<c<<endl;
sum=sum-(n-c);
cout<<sum<<endl;
if(sum<0) {sum=-sum;}
if(sum>0.5 &&c>sum) {sum=ceil(sum)-sum;}
else if(sum>0.5 &&c<sum) {sum=sum-c;}
cout<<fixed<<setprecision(3)<<sum;*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxzc3RyZWFtPgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGZyKGksaixwKSBmb3IoaW50IGk9ajsgaTxwIDtpKyspCiNpbmNsdWRlIDxzdGRpby5oPgojIGRlZmluZSBNX1BJICAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CgovL21lbXNldChiLDAsc2l6ZW9mKGJbMF1bMF0pKjEwMDAwMSo1KTsKLy9zdGQ6OmNvdXQgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig3KSA8PCBtOwovL3R1cGxlCi8vaW50IHMxPTAsbD0wOwovL2xsIG1kPTEwMDAwMDAwMDc7Ci8vbGwgZHBbMTAwMDA1XTsKLy9zZXQ8bGw+IHN0MTsgICAgc2V0PGxsPiBzdDI7Ci8vaW50IGJbMTAwMDA1XVszMl07CmludCBkcFsyN11bMTAwMDA1XTsKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZlY3RvcjxpbnQ+dlsyN107Ci8vdmVjdG9yPGludD5jOwoKCgppbnQgbWFpbigpCnsKICAgIC8vZnJlb3BlbigiaW5wdXQudHh0IiwiciIsc3RkaW4pOwogICAgLy9mcmVvcGVuKCJvdXRwdXQudHh0IiwidyIsc3Rkb3V0KTsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKDApOwogICAgc3RyaW5nIHM7ICAgY2luPj5zOwogICAgbWVtc2V0KGRwLDAsc2l6ZW9mKGRwWzBdWzBdKSoyNyoxMDAwMDUpOwogICAgaW50IGw9cy5sZW5ndGgoKTsKICAgIGZyKGksMCwyNykgIHt2W2ldLnB1c2hfYmFjayhsKTt9CiAgICBmb3IoaW50IGk9bC0xO2k+PTA7aS0tKQogICAgewogICAgICAgIGZyKGosMCwyNikgIHtkcFsoc1tpXS0nYScpXVtpXT1kcFsoc1tpXS0nYScpXVtpKzFdO30KICAgICAgICBkcFsoc1tpXS0nYScpXVtpXT1kcFsoc1tpXS0nYScpXVtpKzFdKzE7CiAgICB9CiAgICBpbnQgbXg9MDsKICAgIGZyKGksMCwyNikgIG14PW1heChteCxkcFtpXVswXSk7CiAgICBmcihpLDAsMjYpCiAgICB7CiAgICAgICAgZnIoaiwwLDI2KQogICAgICAgIHsKICAgICAgICAgICAgaWYoaT09aikgICAgY29udGludWU7CiAgICAgICAgICAgIGludCB4PTA7CiAgICAgICAgICAgIGZyKGssMCxzLmxlbmd0aCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgIAlpZihkcFtpXVtrXT09MCAmJiBkcFtpXVtrXT09ZHBbaV1baysxXSkJY29udGludWU7CiAgICAgICAgICAgICAgICB4PXgrZHBbal1ba107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXg9bWF4KG14LHgpOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQ8PG14PDxlbmRsOwogICAgZnIoaSwwLDI2KQogICAge2ZyKGosMCxsKQl7Y291dDw8ZHBbaV1bal08PCIgIjt9CWNvdXQ8PGVuZGw7fQogICAgcmV0dXJuIDA7Cn0KCi8qaW50IG4sbSxrOwogICAgY2luPj5uPj5tPj5rOwogICAgaW50IGFhPWs7CiAgICBpbnQgZFtuXTsKICAgIGZyKGksMCxuKQogICAgewogICAgICAgIGNpbj4+YVtpXT4+YltpXT4+Y1tpXTsKICAgICAgICBkW2ldPWFhLWFbaV07CiAgICAgICAgaWYoZFtpXTwwKSAge2NvdXQ8PC0xOyBicmVhazt9CiAgICAgICAgYWE9YWErYltpXTsKICAgIH0KICAgIGludCBtbltuXTsKICAgIG1uW24tMV09ZFtuLTFdOwogICAgZm9yKGludCBpPW4tMjtpPj0wLGktLSkKICAgIHsKICAgICAgICBpZihkW2ldPG1uW2krMV0pICAgIHttbltpXT1kW2ldO30KICAgICAgICBlbHNlIG1uW2ldPW1uW2krMV07CiAgICB9CiAgICBwYWlyPGludCxpbnQ+cFttXTsKICAgIGZyKGksMCxtKSAgIHtjaW4+PnBbaV0uZmlyc3Q+PnBbaV0uc2Vjb25kO30KICAgIHNvcnQocCxwK20pOyovCgoKICAgIC8qaW50IG4sYz0wOwogICAgZG91YmxlIHN1bT0wLjAwMDsKICAgIGNpbj4+bjsKICAgIGRvdWJsZSBhWzIqbl07CiAgICBmcihpLDAsMipuKQogICAgewogICAgICAgIGNpbj4+YVtpXTsKICAgICAgICBpbnQgeD1hW2ldOwogICAgICAgIGRvdWJsZSB5PWFbaV0teDsKICAgICAgICBpZih5PT0wKSAgICBjKys7CiAgICAgICAgc3VtPXN1bSt5OwogICAgfQogICAgYz1jLzI7CiAgICBjb3V0PDxjPDxlbmRsOwogICAgc3VtPXN1bS0obi1jKTsKICAgIGNvdXQ8PHN1bTw8ZW5kbDsKICAgIGlmKHN1bTwwKSAgIHtzdW09LXN1bTt9CiAgICBpZihzdW0+MC41ICYmYz5zdW0pICB7c3VtPWNlaWwoc3VtKS1zdW07fQogICAgZWxzZSBpZihzdW0+MC41ICYmYzxzdW0pICAgIHtzdW09c3VtLWM7fQogICAgY291dDw8Zml4ZWQ8PHNldHByZWNpc2lvbigzKTw8c3VtOyovCg==