Codeforces 174B【模拟构造】

题意:
给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名;
思路:
那么以"."作为分割点,把字符串都拿出来,然后
首段长度<=8 OK;
中间<=11 OK;
尾段<=3 OK;

否则都不行;

啊,水题啊,wa了一次,T了一次,神TM都是数据开小了,

一个是4e5写成5e4。。。

一个是不满足的情况可能会很长,才开了。。。25...

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;

const int N=4e5+10;
struct asd
{
    int length;
    char tep[50];
};
int num;
asd q[N];
char s[N];

char ans[N][50];
char temp[N];

int main()
{
    int temp_num;
    scanf("%s",s);
    int len=strlen(s);
    bool flag=false;
    num=0;
    temp_num=0;
    for(int i=0; i<len; i++)
    {
        if(s[i]=='.')
        {
            if(!flag)
            {
                if(temp_num>8||!temp_num)
                {
                    puts("NO");
                    return 0;
                }
                temp[temp_num]='';
                strcpy(q[num].tep,temp);
                q[num].length=temp_num;
                num++;
                flag=true;
            }
            else
            {
                if(temp_num>11||temp_num<2)
                {
                    puts("NO");
                    return 0;
                }
                temp[temp_num]='';
                strcpy(q[num].tep,temp);
                q[num].length=temp_num;
                num++;
            }
            temp_num=0;
        }
        else
            temp[temp_num++]=s[i];
    }
    if(!temp_num||temp_num>3||!flag)
    {
        puts("NO");
        return 0;
    }
    temp[temp_num]='';
    strcpy(q[num].tep,temp);
    q[num].length=temp_num;
    num++;
    int kp=0;
    int ans_num=0;
    int pp=0;
    for(int i=1;i<num;i++)
    {
        pp=0;
        for(int j=kp;j<q[i-1].length;j++)
            ans[ans_num][pp++]=q[i-1].tep[j];
        ans[ans_num][pp++]='.';
        if(q[i].length>3)
            kp=3;
        else
            kp=1;
        if(i==num-1)
            kp=q[i].length;
        for(int j=0;j<kp;j++)
            ans[ans_num][pp++]=q[i].tep[j];
        ans[ans_num][pp]='';
        ans_num++;
    }
    puts("YES");
    for(int i=0;i<ans_num;i++)
        printf("%s
",ans[i]);
    return 0;
}




原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777498.html