题意
很好理解,找到最长的它的所有非空子串都出现过的字符串。
做法
我们发现这个要求实际上相当苛刻,如果一个字符串满足条件,那么它所有字串都应该满足条件,我们考虑按长度从大到小排序,然后直接枚举每个字符串的子串是否出现过。
字符串总长不超过 $10^5$,而一个满足要求的字符串的所有子串都会出现,这样看就只有长度小于大约 $400$ 的字符串能成为答案,在最坏情况下约需要判断 $100000^{\frac{3}{2}}$ 次,但是实际上由于字母数量有限,远远跑不满。
我们再利用字符串哈希或者 map/set 存储所有字符串来判断即可通过此题。
代码
#include<bits/stdc++.h>
using namespace std;
int n;
string s[100005];
unordered_map<string,bool> um;
bool cmp(string &a,string &b){
return a.size()>b.size();
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
um[s[i]]=1;
}
sort(s,s+n,cmp);//按字符串长度排序
for(int i=0;i<n;i++){
bool flag=1;
for(int p=0;flag&&p<s[i].size();p++){
for(int k=1;k+p<=s[i].size();k++){
if(um.find(s[i].substr(p,k))==um.end()){//判断字串是否出现
flag=0;break;
}
}
}
if(flag) {
cout<<s[i].size();
return 0;
}
}
return 0;
}
最后一次更新于2023-06-02
真棒!
By psdbjxgskt at November 20th, 2024 at 06:46 am.
博主太厉害了!
By uylfnwezxt at November 20th, 2024 at 06:44 am.