#includeiostream #includestring #includeclimits #includealgorithm #includesstream #includevector #includeunordered_map using namespace std; struct String { bool judge false;//脏标记默认为无 string s ;//字符串本体默认为空 vectorstring p;//待更新运算式 }; unordered_mapstring, String strings;//变量名对应内容 //判断该变量是否被初始化 bool Find(string name) { if (strings.find(name) ! strings.end()) { return true; } else { return false; } } void operator1(vectorstring parts) {//处理直接赋值操作包括脏变量的懒赋值 string m_name parts[1]; string cur ; for (int i 2; i parts.size(); i) { if (parts[i][0] ! $) {//处理立即字符串 cur parts[i]; } else {//处理变量 string name parts[i].substr(1);//删除$ if (Find(name)) { if (strings[name].judge false) {//不脏直接加 cur strings[name].s; } else { operator1(strings[name].p);//先更新脏的变量 cur strings[name].s; } } else {//变量未初始化默认为空 continue; } } } strings[m_name].s cur; } int operator2(string name) {//返回变量的长度 if (strings[name].judge true) { operator1(strings[name].p); } return strings[name].s.size() % 1000000007; } int main() { int n; cin n; cin.ignore(numeric_limitsstreamsize::max(), \n);//忽略剩余字符 //依次处理各个表达式 while (n--) { string s; getline(cin, s); stringstream ss(s);//用字符流 string segment; vectorstring parts;//存放表达式的元素 //按空格分隔 while (ss segment) { parts.push_back(segment); } if (parts[0] 1) { operator1(parts); } else if (parts[0] 2) { strings[parts[1]].p parts; strings[parts[1]].judge true;//标记脏 } else { int num operator2(parts[1]); cout num endl; } } return 0; }这一题主要考察字符串的一些操作包括间接赋值和直接赋值像cin.ignore字符流sstream根据空格分割字符串提取每一行这样的字符串操作主包都有些许忘记了包括string的substr和erase这样的操作还有哈希表的find这里我想用哈希表unordered_map存储变量名和变量信息的映射变量信息包括变量的值脏标记和对应的赋值表达式如果为脏因为哈希表可以自动初始化比较方便直接索引访问但是遗憾的是我的代码虽然正确但是仅仅过了4个测试集其余6个测试集均为超时还需要改进思考。想要达到300分这第三题绝对要拿下因为我们最终需要输出的是字符串的长度而不是字符串因此我们只需要关注字符串的长度而非他本身就可以将字符串的拼接变为长度的相加因为字符串的拼接比较耗时但是经过改进后我的代码仍只能过四个测试集。因为我更新间接赋值相关的变量后会影响间接赋值的对象所以导致我每次都在用之前都需要更新一遍脏变量看似每次都需要无脑更新。我进行了两次修改1.将字符串的拼接改为字符串长度的相加2.将脏变量的访问改为单纯的计算不进行更新操作因为反正每一次访问都要进行重新计算减少了结构体的修改*如果后续需要再次访问可能缓存更好一点但是我感觉实现能知脏变量何时更新比较复杂#includeiostream #includestring #includeclimits #includealgorithm #includesstream #includevector #includeunordered_map using namespace std; struct String { bool judge false;//脏标记默认为无 vectorstring p;//待更新运算式 long long len 0;//* }; unordered_mapstring, String strings;//变量名对应内容 //判断该变量是否被初始化 bool Find(string name) { if (strings.find(name) ! strings.end()) { return true; } else { return false; } } // 新增一个纯查询函数不修改状态 long long queryLen(const string name) { auto it strings.find(name); if (it strings.end()) return 0; if (it-second.judge false) { return it-second.len; } // 脏变量现场计算但不缓存 long long sum 0; for (int i 2; i it-second.p.size(); i) { if (it-second.p[i][0] ! $) { sum it-second.p[i].length(); } else { sum queryLen(it-second.p[i].substr(1)); // 递归查询不修改 } sum % 1000000007; } return sum; } void operator1(vectorstring parts) {//处理直接赋值操作包括脏变量的懒赋值 string m_name parts[1]; long long sum 0; for (int i 2; i parts.size(); i) { if (parts[i][0] ! $) {//处理立即字符串 //cur parts[i]; sum parts[i].length();//* } else {//处理变量 string name parts[i].substr(1);//删除$ if (Find(name)) { if (strings[name].judge false) {//不脏直接加 sum strings[name].len;//* } else { sum queryLen(name); } } else {//变量未初始化默认为空 continue; } } } strings[m_name].len sum % 1000000007; } int operator2(string name) {//返回变量的长度 if (strings[name].judge true) { operator1(strings[name].p); } return strings[name].len % 1000000007; } int main() { int n; cin n; cin.ignore(numeric_limitsstreamsize::max(), \n);//忽略剩余字符 //依次处理各个表达式 while (n--) { string s; getline(cin, s); stringstream ss(s);//用字符流 string segment; vectorstring parts;//存放表达式的元素 //按空格分隔 while (ss segment) { parts.push_back(segment); } if (parts[0] 1) { operator1(parts); } else if (parts[0] 2) { strings[parts[1]].p parts; strings[parts[1]].judge true;//标记脏 } else { int num operator2(parts[1]); cout num endl; } } return 0; }在之前的基础上又过了两个测试集主包已经尽力了在减少时间开销上我还需要花些功夫