题意:
背景:
一个小型俄罗斯公司H&H决定冲击国际社会以完善他们自己的脚本语言。你被雇佣来参与完成这个工程,你的任务非常简单——码出“子串”的功能部分。
“子串”功能要用到一下几种操作:
$value= substr($string, begin, count);
$value= substr($string, begin);
substr($string,begin, 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, begin,count));输出子串的内容;
3. $name1 = $name2;将name2的内容赋给变量name1;
4. $name1 = substr($name2, begin,end);将子串的内容赋给name1;
5. substr($name1, begin1, count1)= substr($name2, begin2, count2);将前一段子串的内容替换成后一段子串的内容;
6. substr($name1, begin1, count1)= $name2;用后一个变量的内容代替前一段子串。
变量名和类似print,substr这样的操作名中不包含空格,其他任何地方都有可能有若干个空格。每行以分号结尾,每一行长度不超过255。后面M行中出现的在前N行中没有定义过的变量同一视作空串””。输入中变量个数不大于100。在操作过程中,每个变量的内容长度不超过1000。
substr取得的子串保证不为空。
变量名区分大小写。
输出格式:
输出程序的运行结果,每一行对应一个print()操作。输出不允许添加额外的字符。
样例:
Input
2 9
$a = "0123456789";
$b = "abcdefghigklmn";
print($a);
print( substr($b, 1, 2) );
substr($b, 0, 1) = substr($a, 2, 7);
$c = $b;
print(substr($c,0));
print(substr($a, -2, -1));
print(substr($a, -6, 2));
print(substr($a, -5));
print(substr($a, 1, 2));
Output
0123456789
bc
2345678bcdefghigklmn
8
45
56789
12
感想:
题意即题解。
刚开始因为各种没看清题错成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%d\n", &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)+1;
j = line.find_first_not_of(' ', j);
if(line[j] == '$')
str[name] = str[get_name(line, j)];
else
{
int pos = 0, len = 0;
str[name] = get_substr(line, j, name2, pos, len);
}
}
if(line[j] == 's')
{
string name, name2;
int pos = 0, len = 0, pos2 = 0, len2 = 0;
get_substr(line, j, name, pos, len);
j = line.find_first_of('=', j)+1;
j = line.find_first_not_of(' ', j);
if(line[j] == '$')
str[name].replace(pos, len, str[get_name(line, j)]);
else
{
get_substr(line, j, name2, pos2, len2);
str[name].replace(pos, len, str[name2], pos2, len2);
}
}
}
return 0;
}