bzoj4839: [Neerc2016]Abbreviation

細節寫死我QAQ,全場最長。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
    char ch=getchar();int f=0;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();}
    return f;
}
char s[135];bool n_ok[135],vis[135];
char st[125][125];int len[125],now1,now2;
void out()
{
    memset(n_ok,0,sizeof(n_ok));
    for(int i=1;i<=now1;i++)
    {
        if(st[i][1]>='a'&&st[i][1]<='z') n_ok[i]=1;
        if(len[i]==1) n_ok[i]=1;
        for(int j=2;j<=len[i];j++)
        {
            if(st[i][j]>='A'&&st[i][j]<='Z') n_ok[i]=1;
        }
    }
    int last=0;
    for(int i=1;i<=now1;i++)
    {
        if(n_ok[i])
        {
            if(last==1)
            {
                for(int j=1;j<=len[i-1];j++)
                {
                    printf("%c",st[i-1][j]);
                }
                printf(" ");
                for(int j=1;j<=len[i];j++)
                {
                    printf("%c",st[i][j]);
                }
                if(i!=now1)
                printf(" ");
            }
            else if(last==0)
            {
                for(int j=1;j<=len[i];j++)
                printf("%c",st[i][j]);
                if(i!=now1)
                printf(" ");
            }
            else
            {
                for(int j=i-last;j<i;j++)
                printf("%c",st[j][1]);
                printf(" (");
                for(int j=i-last;j<i;j++)
                {
                    for(int k=1;k<=len[j];k++)
                    {
                        printf("%c",st[j][k]);
                    }
                    if(j!=i-1)
                    printf(" ");
                }
                printf(")");
                printf(" ");
                for(int j=1;j<=len[i];j++)
                {
                    printf("%c",st[i][j]);
                }
                if(i!=now1)
                printf(" ");
            }
            last=0;
        }
        else
        {
            last++;
        }
    }
    if(last==1)
    {
        for(int j=1;j<=len[now1];j++)
        {
            printf("%c",st[now1][j]);
        }
    }
    else if(last==0){}
    else
    {
        for(int j=now1-last+1;j<=now1;j++)
        printf("%c",st[j][1]);
        printf(" (");
        for(int j=now1-last+1;j<=now1;j++)
        {
            for(int k=1;k<=len[j];k++)
            {
                printf("%c",st[j][k]);
            }
            if(j!=now1)
            printf(" ");
        }
        printf(")");
    }
}
int main()
{
    while(1)
    {
        memset(vis,0,sizeof(vis));
        char ch;int n=0;
        while(ch=getchar())
        {
            if(ch=='\n'||ch==EOF) break;
            s[++n]=ch;
        }
        int l=1,r=1;now1=0,now2=0;
        while(r<=n)
        {
            if((s[r]>='a'&&s[r]<='z')||(s[r]>='A'&&s[r]<='Z'))
            {
                if((s[r-1]>='a'&&s[r-1]<='z')||(s[r-1]>='A'&&s[r-1]<='Z'))
                {
                    st[now1][++now2]=s[r];
                }
                else
                {
                    len[now1]=now2;
                    now1++;now2=0;
                    st[now1][++now2]=s[r];
                }
            }
            else if(s[r]==' ')
            {
                if((s[r-1]>='a'&&s[r-1]<='z')||(s[r-1]>='A'&&s[r-1]<='Z')){}
                else
                {
                    len[now1]=now2;
                    out();
                    now1=0;now2=0;
                    if(s[r-1]==' '&&s[r-2]!=' '&&!vis[r-1]) 
                    {
                        printf("%c",s[r-1]);
                        vis[r-1]=1;
                    }
                    printf("%c",s[r]);
                    vis[r]=1;
                }
            }
            else
            {
                len[now1]=now2;
                out();
                if(s[r-1]==' '&&s[r-2]!=' '&&!vis[r-1])
                {
                    printf("%c",s[r-1]);
                    vis[r-1]=1;
                }
                now1=0;now2=0;
                printf("%c",s[r]);
                vis[r]=1;
            }
            r++;
        }
        if(now2)
        len[now1]=now2;
        out();
        if(ch==EOF)
        break;
        puts("");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章