【问题描述】
萌蛋有??颗珠子,每一颗珠子都写有一个数字。萌蛋把它们用线串成了环。我们称一个数字串是有趣的,当且仅当它的第 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; }
时间: 2024-10-28 20:26:19