专栏文章

题解:P12171 [蓝桥杯 2025 省 Python B] 最长字符串

P12171题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@minm7cg8
此快照首次捕获于
2025/12/02 04:41
3 个月前
此快照最后确认于
2025/12/02 04:41
3 个月前
查看原文
长度大于一的优美字符串都得从长度更小的推过来,所以把所有字符串按长度从小到大排序。使用一个集合 ss 来存放已知的优美字符串。
接着一个一个遍历:
  • 长度等于一的直接加到 ss 里。
  • 长度大于一的,设它的长度为 ll,把长度为 l1l-1 的前缀单独拉出来按字典序排序,看集合里有没有和排序完的前缀相等的,如果有它就是。
  • 长度大于一的是优美字符串的话,看能不能更新答案,然后,把他整个拉出来按字典序排序,加到 ss 里。

code

CPP
#include<bits/stdc++.h>
using namespace std;
set<string> a;
string s[500010];
bool cmp(string x,string y){
	return x.size()<y.size();
}
int main(){
	string anss;
	int cnt=0;
	int ans=-1;
	while(cin>>s[cnt]){
		if(!s[cnt].empty()){
            cnt++;
        }
	}
	sort(s,s+cnt,cmp);
	for(int i=0;i<cnt;i++){
		if(s[i].empty()){
			continue;
		}
		if(s[i].size()==1){
			a.insert(s[i]);
			continue;
		}
		string s1=s[i];
		s1.erase(s1.size()-1,1);
		sort(s1.begin(),s1.end());
		if(a.find(s1)!=a.end()){
			if(ans<(int)s[i].size()){
				ans=s[i].size();
				anss=s[i];
			}
			if(ans==(int)s[i].size()){
				if(s[i]<anss){
					anss=s[i];
				}
			}
			sort(s[i].begin(),s[i].end());
			a.insert(s[i]);
		}
	}
	cout<<anss;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...