已经没有什么好害怕的了

Description

小Y 最近开始学习算法姿势,但是因为小R 非常BB,给了她很多B6 题,所以她觉得自己已经没有什么前途了。于是小R 给了她一些稍微简单的题,让她觉得已经没有什么好害怕的了,其中一道是这样的:
给定一个长度为n 只包含左括号和右括号的序列,现在小R 想要知道经过每一个位置的合法子串有多少个。
空串是一个合法的串,如果A 和B 都是合法的串,那么(A) 和AB 都是合法的串。

Input

第一行输入一个正整数T 表示数据组数。接下来T 行每行一个字符串。

Output

对于每组数据,输出一个整数表示答案,令ansi 为经过第i 个位置的子串个数,那么你需要输出(注意是先求余再求和)

Sample Input

1
()()

Sample Output

20
样例解释:
ans 数组为{2,2,2,2},所以输出20。

Data Constraint

对于10% 的数据,n<=100
对于30% 的数据,n <= 1000
对于60% 的数据,n <= 5 <= 10^4
对于100% 的数据,n <= 10^6,1 <= T<= 10

.
.
.
.
.
.
分析
栈+差分约束
用栈处理对应的括号
把整个字符串拆成几段(跳过没用的括号),然后计算即可
对于每一段序列,我们从大到小处理,即从整体到局部
再用差分约束的思想求出每个点所被经过的合法的括号序列的个数

.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,a[1000010],l[1000010],r[1000010],f[1000010],next[1000010],last[1000010];
char zf[1000010];
long long ans,t[1000010];

void work() 
{
    memset(l,0,sizeof(l));
    memset(r,0,sizeof(r));
    memset(t,0,sizeof(t));
    
    for (int i=n+1;i>=1;i--) 
	{
        r[i]++;
        r[last[i]]+=r[i];
    }
    
    for (int i=1;i<=n;i++) 
	{
        l[i]--;
        l[next[i]]+=l[i];
    }
    for (int i=1;i<=n;i++) 
		t[i]=r[i]+l[i];
    for (int i=1;i<=n;i++) 
		t[i]+=t[i-1];
    long long ans=0;
    for (int i=1;i<=n;i++) 
		ans=(long long)ans+(long long)i*t[i]%1000000007;
    printf("%lld\n",ans);
}

int main() 
{
    int t;
    scanf("%d",&t);
    while (t--) 
	{
        scanf("%s",zf+1);
    	n=strlen(zf+1);
        memset(f,0,sizeof(f));
    	memset(last,0,sizeof(last));
    	memset(next,0,sizeof(next));
    	int head=0;
    	for (int i=1;i<=n;i++) 
			if (zf[i]=='(') f[++head]=i; else 
			if (head!=0)
			{
				next[f[head]]=i+1;
				last[i+1]=f[head--];
			}
        work();
    }
}
<think>好的,用户一会儿要上机考试,现在感到害怕。我需要先理解他的情绪和需求。他可能面临考试压力,需要实用的建议来缓解焦虑,同时可能希望得到备考策略或心理调节的方法。 首先,用户提到的是上机考试,这可能涉及到编程或操作特定软件,所以需要针对这类考试的特点给出建议。比如环境熟悉、调试技巧、时间管理等。 然后,用户的恐惧可能源于准备不足、害怕出错、时间不够或者对考试环境不熟悉。我需要分步骤来帮助他应对这些可能的焦虑点。 接下来,我应该从心理调节和实战技巧两方面入手。心理方面,可以建议深呼吸、积极暗示等;实战方面,可以包括时间分配、审题策略、调试技巧等。 还要考虑用户可能在考试中遇到的具体问题,比如遇到不会的题目怎么办,如何高效调试代码,如何避免低级错误等。需要给出具体的应对方法,例如先跳过难题、写伪代码等。 另外,用户可能没有明确说出他的考试科目,但根据之前的对话历史,他询问过string.h,可能考试内容涉及C语言编程,所以可以适当加入编程考试的小技巧,比如注释、测试用例、边界条件检查等。 需要确保建议条理清晰,步骤明确,让用户容易理解和执行。同时语言要温和鼓励,帮助他建立信心,减少焦虑感。避免使用复杂术语,保持简洁实用。 最后,总结一下,确保涵盖心态调整和实际操作,给予积极的支持,让他感觉有备而来,从而减轻害怕的情绪。</think>别担心!上机考试前感到紧张是正常的,关键是如何调整心态并高效应对。以下为你整理了一份**考前急救指南**,帮你稳住心态、抓住重点: --- ### **一、考前最后1小时:快速调整状态** 1. **心理暗示** - 默念:"我已经尽力准备了,现在只需要冷静发挥!" - 回想过去成功解决代码问题的经历,增强信心。 2. **身体放松** - 深呼吸:用鼻子吸气4秒 → 屏息4秒 → 缓慢呼气6秒,重复3次。 - 轻按合谷穴(虎口位置)10秒,缓解手抖。 3. **环境检查** - 提前登录考试系统,确认编译器/IDE是否正常(如:代码补全快捷键、调试功能)。 - 准备好草稿纸(如有需要),测试键盘、鼠标灵敏度。 --- ### **二、考试中:实战技巧** #### **1. 读题策略** - **划重点**:用注释标出题目中的关键要求(如:输入输出格式、时间复杂度限制)。 ```c // 题目要求:输出斐波那契数列第n项(n≤1000,需用动态规划) ``` - **防陷阱**:特别注意边界条件(如:n=0、数组越界、浮点数精度)。 #### **2. 时间分配** - **3-2-1法则**: - 简单题(30分钟):快速拿下基础分(如:字符串处理、循环结构)。 - 中等题(20分钟):优先做有思路的题(如:递归、简单算法)。 - 难题(10分钟):先写伪代码或部分逻辑,最后回头补全。 #### **3. 代码救命技巧** - **先框架后细节**: ```c // 1. 写出函数定义和输入输出框架 // 2. 填充核心逻辑(用注释占位) // 3. 补充细节(如:变量初始化、循环条件) ``` - **调试锦囊**: - 用`printf`打印中间变量(考后记得删除)。 - 分段测试:单独验证函数功能(如:先测试排序函数再整合)。 --- ### **三、常见问题应对** 1. **遇到卡壳** - **跳过标记**:在难题旁注释`// TODO`,避免死磕。 - **降级实现**:若想不到最优解,先写暴力解法保分(如:用双重循环代替哈希表)。 2. **突发状况** - 编译器报错看不懂?**优先检查**: - 分号缺失、括号不匹配 - 变量未初始化(如:`int sum;` → `int sum = 0;`) - 代码逻辑混乱?**画流程图**理清思路(用草稿纸)。 --- ### **四、考后心理建设** - 无论发挥如何,考完**不要对答案**,专注下一场考试。 - 记住:上机考试的目标是**展现当前水平**,而非完美无缺! --- **最后一句鼓励**:你为这次考试付出的每一分钟代码练习,都会成为考场上的肌肉记忆。深呼吸,敲下第一个`#include`吧!💻🚀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值