1. 程式人生 > >【NOIP模擬賽】珠

【NOIP模擬賽】珠

== pen pan 復雜度 max mes algo 輸出 sin

【問題描述】

萌蛋有??顆珠子,每一顆珠子都寫有一個數字。萌蛋把它們用線串成了環。我們稱一個數字串是有趣的,當且僅當它的第 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模擬賽】珠