help me pls
查看原帖
help me pls
813622
Igallta楼主2024/4/17 20:54

CF292C

我第一个样例输出了一大堆东西,结果我一看:好像都是对的,但是实际上只有六个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;
}
2024/4/17 20:54
加载中...