【题解】csp.ac #12. 网址压缩(T1-3)

题目

csp.ac #12. 网址压缩(T1-3)

思路

对于一个第一次出现的字符串,我们随意一个位置删去,并用map存下这个字符串的答案,如果不是第一次出现就直接输出map中的答案。即便是随机删也很容易不同的字符串删出相同的答案比如aabbbbbbbbbbbbbabbbbbbbbbbbbbb,我们再用一个map来判断当前答案出现过没,如果出现过就在随机一个位置删就行了。

Code

#include<ctime>
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<map>

inline void read(int &T) {
	int x=0;bool f=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	T=f?-x:x;
}

int n;
std::string sss;
std::map<std::string,std::string> m;
std::map<std::string,bool> mm;

int main() {
	read(n);srand(time(0));
	for(int i=1;i<=n;++i) {
		std::cin>>sss;
		int len=sss.length();
		if(m[sss]!="") std::cout<<m[sss]<<'\n';
		else {
			while(1) {
				int x=rand()%len;
				std::string ans="";
				for(int j=0;j<len;++j) {
					if(j==x) continue;
					ans+=sss[j];
				}
				m[sss]=ans;
				if(mm[ans]) continue;
				mm[ans]=1;
				std::cout<<ans<<'\n';
				break;
			}
		}
	}
	return 0;
}
posted @ 2020-04-30 21:38  yu__xuan  阅读(131)  评论(0编辑  收藏  举报