292C
#include<iostream>
#include<set>
#include<vector>
#include<cstring>
using namespace std;
int n;
int used[20],t[20],temp[20],A[20],used1[20];
string a[10],s,s1;
char c[11];
set<string>pd;
set<int>visit;
vector<string>ans;
void dfs2(int d,int dot,int len)
{
if(d==0)
{
// for(int i=1;i<=len;i++)
// cout<<t[i];
// cout<<endl;
}
if(dot==5&&d==len)
{
s="";
s1="";
int pos=0;
for(int i=1;i<=4;i++)
{
// cout<<a[i]<<endl;
for(int j=0;j<a[i].length();j++)
{
pos=j;
if(a[i][j]!='0'&&a[i][j]!='.')
break;
}
// cout<<"pos="<<pos<<endl;
if(i!=1)
s=s+'.';
for(int j=pos;j<a[i].length();j++)
{
s=s+a[i][j];
s1=s1+a[i][j];
}
}
int l=0;
int r=s1.length()-1;
visit.clear();
while(s1[l]==s1[r])
{
visit.insert(s1[l]-'0');
visit.insert(s1[r]-'0');
if(l>r)
break;
l++;
r--;
}
for(int i=1;i<=n;i++)
if(!visit.count(A[i]))
return;
if(l>r&&!pd.count(s))
{
ans.push_back(s);
pd.insert(s);
}
return;
}
if(dot==5&&d!=len)
return;
if(d+(5-dot)*3<len||d+5-dot>len)
return;
if(d+1<=len)
{
a[dot]=a[dot]+c[t[d+1]];
dfs2(d+1,dot+1,len);
a[dot]="";
}
if(d+2<=len)
{
a[dot]=a[dot]+c[t[d+1]];
a[dot]=a[dot]+c[t[d+2]];
dfs2(d+2,dot+1,len);
a[dot]="";
}
int temp=0;
for(int i=d+1;i<=d+3;i++)
{
temp*=10;
temp+=t[i];
}
if(d+3<=len&&temp<256)
{
a[dot]=a[dot]+c[t[d+1]];
a[dot]=a[dot]+c[t[d+2]];
a[dot]=a[dot]+c[t[d+3]];
dfs2(d+3,dot+1,len);
a[dot]="";
}
}
void Copy1(int l)
{
memset(t,0,sizeof(t));
for(int i=1;i<=l;i++)
t[i]=temp[i];
for(int i=l+1;i<=2*l;i++)
t[i]=temp[2*l-i+1];
// cout<<"cpy1:";
// for(int i=1;i<=2*l;i++)
// cout<<t[i]<<" ";
// cout<<endl;
}
void Copy2(int l)
{
memset(t,0,sizeof(t));
for(int i=1;i<=l;i++)
t[i]=temp[i];
for(int i=l+2;i<=2*l;i++)
t[i-1]=temp[2*l-i+1];
// cout<<"cpy2:";
// for(int i=1;i<2*l;i++)
// cout<<t[i]<<" ";
// cout<<endl;
}
void dfs1(int d)
{
if(d==8)
return;
bool flag=true;
for(int i=1;i<=n;i++)
if(!used[A[i]])
{
flag=false;
break;
}
if(flag)
{
Copy1(d-1);
dfs2(0,1,2*d-2);
Copy2(d-1);
dfs2(0,1,2*d-3);
// return;
}
for(int i=1;i<=n;i++)
{
used[A[i]]++;
temp[d]=A[i];
dfs1(d+1);
temp[d]=-1;
used[A[i]]--;
}
}
int main()
{
cin>>n;
memset(temp,-1,sizeof(temp));
for(int i=1;i<=n;i++)
cin>>A[i];
for(char i='0';i<='9';i++)
c[i-'0']=i;
dfs1(0);
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i]<<endl;
return 0;
}