CHEFSIGN: 大厨与符号序列
题目描述 大厨昨天捡到了一个奇怪的字符串 s,这是一个仅包含‘<’、‘=’和‘>’三种比较符号的字符串。 记字符串长度为 N,大厨想要在字符串的开头、结尾,和每两个字符之间插入一个正整数,共 N + 1 个数。大厨希望插入数字之后,这些比较符号所表达的含义是正确的。举个例子,如果 在‘<’前后分别插入 a 和 b,那么应当有 a < b。对于‘=’和‘>’也是类似的。 大厨可以在 [1,P] 中任意选择数字插入,同一个数也可以被插入到多个位置。 请你帮大厨计算 P 的最小取值可以是多少。
输入格式
输入的第一行包含一个整数 T,代表测试数据的组数。接下来是 T 组数据。 每组数据仅有一行,包含一个字符串 s。保证字符串仅包含‘<’、‘=’和‘>’三种字符。
输出格式
对于每组数据,输出一行,包含一个整数,代表 P 的最小取值。
数据范围和子任务 • 1 ≤ T,N ≤ 105 • 1 ≤每组数据中 N 之和≤ 106 子任务 1(30 分): • 1 ≤ T,N ≤ 103 • 1 ≤每组数据中 N 之和≤ 104
子任务 2(70 分): • 无附加限制
样例数据
输入 4 <<< <>< <=> <=<
输出 4 2 2 3
样例解释
下面对于每组数据分别给出一种可行的插入整数的方案: • 1 < 2 < 3 < 4 • 1 < 2 > 1 < 2 • 1 < 2 = 2 > 1 • 1 < 2 = 2 < 3
这道题其实就是计算连续的一段相同字符有多少就解决了 当然要考虑全是等于号的情况 这是答案是一
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int M=1e6+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int T,sum[M],cnt; char s[M],c; int main() { T=read(); while(T--){ int mx=0,cnt=0; while((c=getchar())!=' '&&c!=EOF) if(c!='=') s[++cnt]=c; if(!cnt){printf("1 "); continue;} for(int i=1;i<=cnt;i++){ if(s[i]==s[i-1]) sum[i]=sum[i-1]+1; else sum[i]=2; mx=max(mx,sum[i]); } printf("%d ",mx); } return 0; }