codeforces 777 D

从前往后  去掉一些后缀 

使得大家成字典序排列  去掉最少 

求完成后序列  傻逼了错了好几次   最中要是string

后面是上来  第一个词 如果大于后面的  那么前面都是#

然后从后面贪心一下  

#include <iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std ;

#define LL long long
#define MAXN 500010
string z[MAXN];
int to[MAXN];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
        cin>>z[i];
    int ok=-1;

    for(int i=n-1;i>=1;i--)
    {
        if(z[i][1]<z[i-1][1])
        {
            ok=i-1;
            break;
        }
    }
    for(int i = ok; i >= 0; i--)   //< to[i]
        to[i]=1;
    //printf("%d\n",ok);
    to[n-1]=z[n-1].size();
    for(int i=n-2;i>=ok+1;i--)
    {
        if(z[i][1]<z[i+1][1])
        {
            to[i]=z[i].size();

        }
        else
        {
            int ok1=0,ok2=0;
            int a=z[i].size();
            int len=min(a,to[i+1]);
            for(int j = 2; j < len; j++)
            {
                if(z[i][j]>z[i+1][j])
                {
                    ok1=j;
                    break;
                }
                else if(z[i][j]<z[i+1][j])
                {
                    ok2=1;
                    break;
                }
                else
                    ok2=2;
            }
            //printf("%d %d\n",ok1,ok2);
            if(ok1!=0)
            {
                to[i]=ok1;
            }
            else if(ok2==1)
                to[i]=z[i].size();
            else
            {
                //printf("%d %d\n",z[i].size(),z[i+1].size());
                if(z[i].size()>to[i+1])
                    to[i]=len;
                else
                    to[i]=z[i].size();
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<to[i];j++)
            printf("%c",z[i][j]);
        printf("\n");
    }

    return 0;
}

 

posted on 2017-02-28 22:22  HelloWorld!--By-MJY  阅读(414)  评论(0编辑  收藏  举报

导航