【NOIP模擬賽】珠
阿新 • • 發佈:2017-08-29
== 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模擬賽】珠