【NOIP模拟赛】珠

 

【问题描述】

萌蛋有?颗珠子,每一颗珠子都写有一个数字。萌蛋把它们用线串成了环。我们称一个数字串是有趣的,当且仅当它的第 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;
}

 

转载于:https://www.cnblogs.com/huihao/p/7449724.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值