一般的软件在显示文本时,都具备这样的功能:双击某个数字或者字母时,这个数字左右两边的数字或者字母都被选中。 经常要处理数字和字母的XiaoC,希望有这样类似的功能:双击一个数字,这个数字左右两边跟它相邻的连续数字被都选中。双击一个字母,这个字母左右两边跟它相邻字母的连续字母都被选中。 Format Input 第一行两个整数n和m,表示文本的长度和询问个数。 接下来一行有n个英文字母或者数字。 接下来m行,每行一个整数x(x∈[0,n-1]),表示双击了第x个位置的字符 n和m的范围[1,500000]; Output 对于m个询问,每个询问输出两个整数L和R,表示[L,R]区间的字符都会被选中。
时间: 2024-02-25 17:57:19 浏览: 89
数字转中文大写软件-DTCC
好的,我理解了您的需求。可以使用以下代码实现:
```python
n, m = map(int, input().split())
s = input().strip()
# 预处理每个数字/字母左侧最长的连续数字/字母长度和右侧最长连续数字/字母长度
left_num, right_num, left_alpha, right_alpha = [0] * n, [0] * n, [0] * n, [0] * n
for i in range(n):
if s[i].isdigit():
left_num[i] = left_num[i-1] + 1 if i > 0 else 1
right_num[i] = right_num[i+1] + 1 if i < n-1 else 1
elif s[i].isalpha():
left_alpha[i] = left_alpha[i-1] + 1 if i > 0 else 1
right_alpha[i] = right_alpha[i+1] + 1 if i < n-1 else 1
# 处理每个询问
for i in range(m):
x = int(input())
l, r = x, x
if s[x].isdigit():
# 如果双击的是数字,向左右扩展
while l > 0 and left_num[l-1] >= left_num[x]:
l -= 1
while r < n-1 and right_num[r+1] >= right_num[x]:
r += 1
elif s[x].isalpha():
# 如果双击的是字母,向左右扩展
while l > 0 and left_alpha[l-1] >= left
阅读全文