题解:CF2169B Drifting Away
little_stickman · · 题解
CF2169B Drifting Away题解
主要题意
你要进行河上漂流旅行,路线由水流方向组合(一列字符)来决定:若为 > 就向右移一格;若为 < 就向左移一格;若为 * 就由你决定向左或向右走。
当你漂流到河外时,就算结束了旅行。
求出你最大旅行的时间(可能能无限航行,要判断)。
解题思路
首先,如果出现 *<,**,><,>* 这些水流组合时,就肯定可以无限航行了。
排除存在这些情况后,我们可以发现:一个水流组合中,最多只会出现一个 * 符号;且若出现 * 符号,整个水流组合就会被分为两段;否则就要么是一个只有向同一个方向的水流组合,要么是两段不同方向的水流组合。
这样,排除无限航行情况,有 * 符号的水流组合的最长时间就是连续的相同符号长度加一;否则就是整个序列的最长连续相同符号的长度。
上代码!
#include <bits/stdc++.h>
using namespace std;
string str;
int main()
{
int T;
cin >> T;
while(T --)
{
cin >> str;
int len = str.length();
bool fg = 0;
for(int i = 0;i < len;i ++)
{
if(
str[i] == '*' && str[i + 1] == '<' ||
str[i] == '*' && str[i + 1] == '*' ||
str[i] == '>' && str[i + 1] == '<' ||
str[i] == '>' && str[i + 1] == '*'
)//可以无限航行的情况
{
fg = 1;
break;
}
}
long long ans = 0;
if(fg)
{
cout << -1 << endl;
continue;
}
else
{
for(int i = 0;i < len;i ++)
{
if(str[i] == '*')//如果有 *
{
ans = max(i + 1, len - i);
fg = 1;
break;
}
else if(i > 0 && str[i] != str[i - 1])//两段分别的长度
{
ans = max(i, len - i);
fg = 1;
break;
}
}
if(!fg)//只有一种水流
ans = len;
}
cout << ans << endl;
}
return 0;
}