[ICPC 2024 Chengdu R] Arrow a Row题解

P15072 [ICPC 2024 Chengdu R] Arrow a Row

题目描述

定义一个“箭头字符串”为满足以下条件的字符串:

  • 字符串长度至少为 555
  • 字符串以 >\tt{>}> 开头,以 >>>\tt{>}\tt{>}\tt{>}>>> 结尾。
  • 字符串的其余部分仅由 −\tt{-} 组成。

例如,>−−>>>\tt{>}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}>>>>>−−−>>>\tt{>}\tt{-}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}>>>> 是有效的箭头字符串,而 >−>>\tt{>}\tt{-}\tt{>}\tt{>}>>>>−>−>>>\tt{>}\tt{-}\tt{>}\tt{-}\tt{>}\tt{>}\tt{>}>>>>> 则不是。

Sauden 给你一个长度为 nnn 的字符串 sss,仅由 >\tt{>}>−\tt{-} 组成。你需要通过对一个同样长度为 nnn、完全由 ∗\tt{*} 组成的字符串执行一系列绘制操作来创建 sss。在一次绘制操作中,你可以选择一个长度至少为 555 的子串,并将其转换为一个箭头字符串。你执行的操作总数不能超过 nnn

如果无法在不超过 nnn 次绘制操作的情况下获得字符串 sss,则输出 No\texttt{No}No。否则,输出 Yes\texttt{Yes}Yes 并提供绘制操作的详细信息。如果有多种解决方案,输出任意一种即可。

输入格式

  • 第一行包含一个整数 TTT1≤T≤1041\le T\le 10^41T104),表示测试用例的数量。
  • 每个测试用例包含一行,为一个长度为 nnn5≤n≤1055 \le n \le 10^55n105)的字符串 sss,仅由 >\tt{>}>−\tt{-} 组成。

保证所有测试用例的 nnn 之和不超过 5⋅1055 \cdot 10^55105

输出格式

对于每个测试用例,如果无法在不超过 nnn 次绘制操作的情况下获得给定字符串,则输出一行 No\texttt{No}No。否则,输出 Yes\texttt{Yes}Yes 和一个正整数 mmm1≤m≤n1 \le m \le n1mn),表示需要执行的绘制操作次数。随后输出 mmm 行,每行包含两个整数 ppp1≤p≤n−41\le p\le n-41pn4)和 lll5≤l≤n+1−p5\le l\le n+1-p5ln+1p),分别表示所选子串的起始位置和长度。

输入输出样例 #1

输入 #1

4
>>->>>
>>>->
>>>>>
>->>>>>>

输出 #1

Yes 2
1 5
2 5
No
No
Yes 2
2 7
1 5

说明/提示

对于示例中的第四个测试用例,绘制过程如下所示:

:::align{center}
∗∗∗∗∗∗∗∗\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*}\tt{*} →\rightarrow ∗>−−−>>>‾\tt{*}\underline{\tt{>}\tt{-}\tt{-}\tt{-}\tt{>}\tt{>}\tt{>}}>>>> →\rightarrow >−>>>‾>>>\underline{\tt{>}\tt{-}\tt{>}\tt{>}\tt{>}}\tt{>}\tt{>}\tt{>}>>>>>>>
:::

翻译由 DeepSeek V3 完成

思路

直接贪心构造,考虑先构造后的,再构造前的。
即先将后面的一整串满足了,再来满足前面的串。

代码见下

#include<bits/stdc++.h> 
using namespace std;
long long t,n=0,rf=0,uk;
string str;
char s[100005];
struct one{
	long long l,r;
};
vector<one> v;
int main(){
	cin>>t;
	while(t--){
		cin>>str;
		n=0;
		rf=0;
		for(int i=0;i<str.size();i++){
			s[++n]=str[i];
			if(s[n]=='-'){
				rf=1;
			}
			//cout<<s[n]<<endl;
		}
		v.clear();
		if(s[1]=='-'||s[n]=='-'||s[n-1]=='-'||s[n-2]=='-'||rf==0){
			cout<<"No"<<endl;
			continue;
		}
		uk=n;
		for(int i=n-3;i>=1;i--){
			if(s[i]=='-'){
				uk=i+3;
				for(int j=n;j>=uk;j--){
					v.push_back({1,j-1+1});
				}
				break;
			}
		}
		//cout<<v.size()<<endl;
		for(int i=1;i<=uk-3;i++){
			if(s[i]=='>'){
				v.push_back({i,uk-i+1});
			}
		}
		cout<<"Yes"<<" "<<v.size()<<endl;
		for(int i=0;i<v.size();i++){
			cout<<v[i].l<<" "<<v[i].r<<endl;
		}
	}
	return 0; 	
}
posted @ 2026-01-26 21:04  bz02_2023f2  阅读(3)  评论(0)    收藏  举报  来源