Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstdio>
- #include<vector>
- #include<algorithm>
- using namespace std;
- int check[100000],b,maxus,maxn,a,m,n;
- string r[200000],otv,s,leks[10];
- bool flag;
- string lex(string a,string b){
- leks[0]=a;
- leks[1]=b;
- sort(leks,leks+2);
- return leks[0];
- }
- int prefix_function(string l, int b) {
- maxus=0;
- for(int k=0;k<m;k++){
- int pi[500005]={};
- if(k==b)
- continue;
- s=l+'#'+r[k];
- //cout<<" "<<s;
- int n = (int) s.length();
- for (int i=l.size(); i<n; ++i) {
- int j = pi[i-1];
- while (j > 0 && s[i] != s[j])
- j = pi[j-1];
- if (s[i] == s[j]){
- ++j;
- }
- pi[i] = j;
- maxn=max(maxn,j);
- }
- maxus=max(maxus,maxn);
- maxn=0;
- }
- return maxus;
- }
- int main(){
- cin>>m;
- for(int i=0;i<m;i++)
- cin>>r[i];
- for(int i=0;i<m;i++){
- b=i;
- otv=r[i];
- for(int j=0;j<r[i].size();j++){
- s=r[i].substr(j,r[i].size()-j);
- //cout<<s<<" ";
- int a=prefix_function(s,b);
- if(j==0&&a==r[i].size()){
- cout<<"?"<<endl;
- flag=true;
- break;
- }
- if(a==r[i].size()-j)
- break;
- if(otv.size()==a+1)
- otv=lex(otv,r[i].substr(j,a+1));
- else
- if(a+1<otv.size())
- otv=r[i].substr(j,a+1);
- maxus=0;
- }
- if(flag==false)
- cout<<otv<<endl;
- flag=false;
- }
- //
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement