codeforce988B substring sort

题目链接

给出N个字符串,给他们排序,第一个是第二个的子串,第二个是第三个的子串,一直排到最后一个.问是否能实现这样的排序,如果能输出YES并且输出排序后的N个字符串;不能输出NO


题目不是很难,主要就是匹配子串上,而且题目数据很小,暴力一下也能过.写这个水题主要是因为去年自己不会
先按长度降序排列,这样一但出现不是子串的情况就能立刻判断不存在这样的排序.在这里用的字符hash判断是否是子串,hash不会见自我推销

#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned long long
#define Pair pair<int,int>
#define re return

#define getLen(name,index) name[index].size()
#define mem(a,b) memset(a,b,sizeof(a))
#define Make(a,b) make_pair(a,b)
#define Push(num) push_back(num)
#define rep(index,star,finish) for(register int index=star;index<finish;index++)
#define drep(index,finish,star) for(register int index=finish;index>=star;index--)
using namespace std;
const ull base=1e9+7;

template<class T> void _deb(const char *name,T val){
    cout<<name<<val<<endl;
}

int N;
string store[105];
int seq[105];
ull Hash[105];

bool cmp(string a,string b);
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>N;
    rep(i,0,N){
        cin>>store[i];
    }
    sort(store,store+N,cmp);
    //cout<<store[0]<<endl;
    bool iSort=true;
    rep(i,0,N-1){
        string &org=store[i];
        string &next=store[i+1];
        int len_org=org.size();
        int len_next=next.size();
		//make hash
        mem(Hash,0);
        Hash[0]=0;
        rep(pos,1,len_org+1){
            Hash[pos]=Hash[pos-1]*base+org[pos-1]-'a';
        }
		//get substring hash
        ull aim=0;
        ull temp=1;
        rep(pos,1,len_next+1){
            aim=aim*base+next[pos-1]-'a';
            temp*=base;
        }
		//match
        ull hash1;
        bool isFind=false;
        rep(pos,len_next,len_org+1){
            hash1=(Hash[pos]-Hash[pos-len_next]*temp);
            if(hash1==aim){
                isFind=true;
                break;
            }
        }
        if(!isFind){
            iSort=false;
            break;
        }
    }

    if(iSort){
        cout<<"YES"<<endl;
        drep(i,N-1,0)
            cout<<store[i]<<endl;
    }else{
        cout<<"NO"<<endl;
    }


    re 0;
}
bool cmp(string a,string b){
    re a.size()>b.size();
}

发布了161 篇原创文章 · 获赞 170 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/white_156/article/details/103266310
今日推荐