加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

sgu189:Perl-like Substr(字符串处理)

发布时间:2020-12-15 23:48:47 所属栏目:大数据 来源:网络整理
导读:题意: ? 背景: ???????? 一个小型俄罗斯公司HH决定冲击国际社会以完善他们自己的脚本语言。你被雇佣来参与完成这个工程,你的任务非常简单——码出“子串”的功能部分。 ???????? “子串”功能要用到一下几种操作: ???????? $value= substr($string,begin

题意:

?

背景:

???????? 一个小型俄罗斯公司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?
$a = "0123456789";?
$b = "abcdefghigklmn";?
print($a);?
print( substr($b,1,2) );?
substr($b,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,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%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;	
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读