sgu189:Perl-like Substr(字符串处理)
题意: ? 背景: ???????? 一个小型俄罗斯公司H&H决定冲击国际社会以完善他们自己的脚本语言。你被雇佣来参与完成这个工程,你的任务非常简单——码出“子串”的功能部分。 ???????? “子串”功能要用到一下几种操作: ???????? $value= substr($string,begin,count); ???????? $value= substr($string,begin); ???????? substr($string,count) = $newstring; ???????? substr($string,begin) = $newstring; ???????? $string(‘$’是一个变量的前缀)表示原本的串。begin表示子串的开头:如果begin>=0,表示左数第begin个(以0为第一个),begin<0代表右数第begin个(以-1为第一个)。count表示子串的长度,如果count>0,表示从begin开始count个字符,如果count<0,表示从begin开始数除了最后-count个字符其他都属于子串。count不等于0。 ???????? “substr”除了可以取出子串,还可以将子串代替为其他的新串。 ? 输入格式: ???????? 第一行包括两个自然数N(1<=N<=20)——代表初始化有N行和M(1<=M<=300)——输入u余下有M行。接下来的N行表示变量的初始化(没有一行长度>=10000),以如下形式: ???????? $name= “value”; name是变量的名称(总是有一个前缀$),由最多20个字母/数字组成。接下来是一个‘=’号,在接下来是变量的内容value,用一对“”括起来,内容由字母/数字/空格/逗号/点/连字符/下划线/冒号/叹号/问号组成。value的长度不大于255,$name,”=”,”value”之间可以有若干个空格。行末以分号结尾。 接下来的M行包括如下6种操作: 1.??????print($name);输出变量name的内容; 2.??????print(substr($name,count));输出子串的内容; 3.??????$name1 = $name2;将name2的内容赋给变量name1; 4.??????$name1 = substr($name2,end);将子串的内容赋给name1; 5.??????substr($name1,begin1,count1)= substr($name2,begin2,count2);将前一段子串的内容替换成后一段子串的内容; 6.??????substr($name1,count1)= $name2;用后一个变量的内容代替前一段子串。 变量名和类似print,substr这样的操作名中不包含空格,其他任何地方都有可能有若干个空格。每行以分号结尾,每一行长度不超过255。后面M行中出现的在前N行中没有定义过的变量同一视作空串””。输入中变量个数不大于100。在操作过程中,每个变量的内容长度不超过1000。 substr取得的子串保证不为空。 变量名区分大小写。 ? 输出格式: ???????? 输出程序的运行结果,每一行对应一个print()操作。输出不允许添加额外的字符。 ? ? 样例: Input 2 9?
0123456789? ? 感想: ???????? 题意即题解。 ???????? 刚开始因为各种没看清题错成shit…自己翻译过后来造福人类… ???????? 顺便学了一下string,stringstream的用法。 #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <string> #include <sstream> using namespace std; int n,m; map<string,string> str; string get_name(string line,int &j) { string name; for(j = line.find_first_of('$',j)+1; (line[j] >= 'A'&&line[j]<='Z') || (line[j]>='a'&&line[j]<='z') || (line[j] >= '0'&&line[j] <= '9'); ++j) name += line[j]; if(str.count(name) == 0) str[name] = ""; j = line.find_first_not_of(' ',j); return name; } string get_substr(string line,int &j,string &name,int &pos,int &len) { int length; string sub; stringstream num; j = line.find_first_of('(',j)+1; name = get_name(line,j); length = str[name].size(); sub = str[name]; j = line.find_first_of(',',j)+1; j = line.find_first_not_of(' ',j); while(line[j] != ' ' && line[j] != ')' && line[j] != ',') num << line[j++]; num >> pos; if(pos < 0) pos += length; num.clear(); j = line.find_first_not_of(' ',j); if(line[j] == ',') { j++;j = line.find_first_not_of(' ',j); while(line[j] != ' ' && line[j] != ')' && line[j] != ',') num << line[j++]; num >> len; num.clear(); if(len < 0) len = length+len-pos; } else if(line[j] == ')') len = length-pos; j = line.find_first_of(')')+1; j = line.find_first_not_of(' ',j); sub = sub.substr(pos,len); return sub; } int main() { string line; scanf("%d%dn",&n,&m); for(int i = 1; i <= n; ++i) { int j = 0; string name,val; getline(cin,line); name = get_name(line,j); j = line.find_first_of('"',j)+1; for(; line[j] != '"'; ++j) val += line[j]; str[name] = val; } for(int i = 1; i <= m; ++i) { int j = 0; getline(cin,line); j = line.find_first_not_of(' ',j); if(line[j] == 'p') { j = line.find_first_of('(',j)+1; j = line.find_first_not_of(' ',j); if(line[j] == '$') cout << str[get_name(line,j)] << endl; else { string name; int pos = 0,len = 0; cout << get_substr(line,j,name,pos,len) << endl; } } if(line[j] == '$') { string name,name2; name = get_name(line,j); j = line.find_first_of('=',j); if(line[j] == '$') str[name] = str[get_name(line,j)]; else { int pos = 0,len = 0; str[name] = get_substr(line,name2,len); } } if(line[j] == 's') { string name,name2; int pos = 0,len = 0,pos2 = 0,len2 = 0; get_substr(line,len); j = line.find_first_of('=',j); if(line[j] == '$') str[name].replace(pos,len,str[get_name(line,j)]); else { get_substr(line,pos2,len2); str[name].replace(pos,str[name2],len2); } } } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |