码迷,mamicode.com
首页 > 其他好文 > 详细

【NOIP模拟赛】珠

时间:2017-08-29 19:41:47      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:ons   main   顺时针   时间   clu   space   amp   数字   扩展   

 

【问题描述】

萌蛋有??颗珠子,每一颗珠子都写有一个数字。萌蛋把它们用线串成了环。我们称一个数字串是有趣的,当且仅当它的第 1 位是 2,且除了第 1 位以外的每一位都是 3。例如,2,233,2333333 都是有趣的数字串。

现在,你可以从这串珠子的任意一颗开始读,沿着顺时针或逆时针方向,到任意一颗珠子停止。这样,你就可以读出一个数字串来。

萌蛋想知道,所有能读出的有趣的数字串当中,最长的是哪一个数字串。当然,你也可能读不出任何一个有趣的数字串,你也需要对这种情况做出判断。

【输入文件】

输入只有一行,是一个数字串。这是从这串珠子的某一颗开始,顺时针读取恰好一圈得到的。

【输出文件】

输出只有一行,是能读出的最长有趣的数字串。特殊地,如果找不到任何有趣的数字串,应输出“TvT”(不含引号)。

【输入样例 1】

323

【输出样例 1】

233

【输入样例 2】

333

【输出样例 2】

TvT

【数据规模和约定】

对于 20%的数据,?? ≤ 3。对于 40%的数据,?? ≤ 100。

对于 60%的数据,?? ≤ 1,000。

另有 20%的数据,输入的数字串中不含 3。对于 100%的数据,?? ≤ 100,000。

分析

一道简单的模拟题。遇到环先把环拆成len*2的链,之后分别把所有的2向左右扩展就行了。因为每个点最多会被最多会被扫到两次。时间复杂度O(n)。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200000+5;
char a[maxn];
int main()
{
    freopen("beads.in","r",stdin);
    freopen("beads.out","w",stdout);
    scanf("%s",a);
    int len=strlen(a);
    for(int i=0;i<len;i++)  a[i+len]=a[i];
    int i=0,ans=0; bool flag=0;
    while(i<len*2)
    {
        if(a[i]==2)
        {
            int j; flag=1;
            j=i-1; while(j>=0&&a[j]==3) j--;
            ans=max(ans,i-j-1);
            j=i+1; while(j<len*2&&a[j]==3) j++;
            ans=max(ans,j-i-1);
            i=j-1;
        }
        i++;
    }
    if(!flag) {printf("TvT"); return 0;}
    printf("%d",2);
    for(int i=1;i<=ans;i++) printf("%d",3);
    fclose(stdin); fclose(stdout);
    return 0;
}

 

【NOIP模拟赛】珠

标签:ons   main   顺时针   时间   clu   space   amp   数字   扩展   

原文地址:http://www.cnblogs.com/huihao/p/7449724.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!