我第一个样例输出了一大堆东西,结果我一看:好像都是对的,但是实际上只有六个QAQ
/****************************************
作者:
版权:
日期:
*****************************************/
#include<bits/stdc++.h>
#define LL k<<1
#define RR k<<1|1
#define int long long
using namespace std;
int n,len,a[11];
vector<string>vec,ans;
map<string,bool>mp;
//添加回文数:
void add(int cnt,string s=""){//s:当前字符串 cnt:当前已经添加了多少个数字
if(cnt>=len){
vec.push_back(s);
return;
}
for(int i=1;i<=n;i++){
char c=(a[i]+48);//将这个数字对应成字母
add(cnt+2,c+s+c);
}
}
bool check(string s){//目标纯数字串
if(s[0] == '0'){//如果是零
if(s.size()==1)return 1;
else return 0;//前导零需要去除
}
int pd=stoll(s);//函数。string to long long
return pd>=0&&pd<=255;
}
void dfs(string s){
for(int a=1;a<3;a++){//第一个分割点
for(int b=a+1;b<a+4;b++){//第二个分割点
for(int c=b+1;c<b+4;c++){//第三个分割点
int pd=s.size()-c;
if(pd>=1&&pd<=3){
string s0=s.substr(0,a),s1=s.substr(a,(b-a)),s2=s.substr(b,(c-b)),s3=s.substr(c);//三段
if(check(s0)&&check(s1)&&check(s2)&&check(s3)){
char t='.';
string d=s0+t+s1+t+s2+t+s3;//答案
ans.push_back(d);
// return;
}
}
}
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (len = 8; len <= 12; len++) {//循环枚举 IP 地址的长度
if(len & 1)for(int i=1;i<=n;i++)add(1,""+char(a[i]+48));//如果长度是奇数
else add(0);//是偶数
}
for(auto v:vec){
dfs(v);
}
cout<<ans.size()<<'\n';
for(auto v:ans){
cout<<v<<'\n';
}
return 0;
}