P9364 [ICPC2022 Xi'an R] Perfect Word
题意
很好理解,找到最长的它的所有非空子串都出现过的字符串。
做法
我们发现这个要求实际上相当苛刻,如果一个字符串满足条件,那么它所有字串都应该满足条件,我们考虑按长度从大到小排序,然后直接枚举每个字符串的子串是否出现过。
字符串总长不超过
我们再利用字符串哈希或者 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;
}