本题属于想到解决方法就会很简单的题目.....但我没想到,第一反应是两层for循环枚举字符串,一看数据范围一定超时,然后又不愿动笔,这题真是活该没做出来555
正确思路:
确实是枚举,但没有必要两层for循环,我们结合substr截取子串再利用map或者set判重即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 set<string> s,ans; 4 int main() 5 { 6 // freopen("in.txt","r",stdin); 7 // freopen("out.txt","w",stdout); 8 string str; 9 while(cin>>str){ 10 s.insert(str); 11 } 12 for(auto it=s.begin();it!=s.end();it++){ 13 string tmp = *it; 14 for(int i=1;i<tmp.size();i++){ 15 string s1 = tmp.substr(0,i); 16 string s2 = tmp.substr(i); 17 if(s.count(s1)&&s.count(s2)){ 18 ans.insert(tmp); 19 break; 20 } 21 } 22 } 23 for(auto it:ans) cout<<it<<endl; 24 return 0; 25 }
知识补充:
当看到字符串子串就应该想到substr了,字符串内部的find函数也可以用来查找子串,好久没做字符串题了,复习复习