常规写法:
#include <iostream> #include <vector> #include <cstring> #include <stack> #include <unordered_set> #include <queue> #include <cmath> #define LL long long using namespace std; int main(){ int N; cin>>N; getchar(); string s; getline(cin,s); int prop=s.size(); for(int i=2;i<=N;i++){ string s1; getline(cin,s1); prop=min(prop,(int)s1.size()); for(int len=prop;len>=0;len--){ if(s.substr(s.size()-len,len)==s1.substr(s1.size()-len,len)){ prop=len; break; } } } if(prop>0) cout<<s.substr(s.size()-prop,prop); else cout<<"nai"; return 0; }
用Trie:
#include <iostream> #include <vector> #include <cstring> #include <stack> #include <unordered_set> #include <queue> #include <cmath> #include <unordered_map> #include <algorithm> #define LL long long using namespace std; struct Trie{ unordered_map<char,Trie*> children; }; Trie* root; void buildTrie(string s){ Trie* cur=root; for(char c:s){ if(cur->children.find(c)==cur->children.end()){ cur->children[c]=new Trie(); } cur=cur->children[c]; } } int main(){ int N; cin>>N; getchar(); string s; root=new Trie(); for(int i=1;i<=N;i++){ getline(cin,s); reverse(s.begin(),s.end()); buildTrie(s); } int res=0; Trie* cur=root; while(true){ if(cur->children.size()!=1) break; res++; auto iter=cur->children.begin(); cur=iter->second; } if(res==0) printf("nai"); else { reverse(s.begin(),s.end()); cout<<s.substr(s.size()-res,res); } return 0; }