问一道站外的题目
  • 板块学术版
  • 楼主Chancylaser
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/2/7 21:00
  • 上次更新2023/11/5 03:34:53
查看原帖
问一道站外的题目
241817
Chancylaser楼主2021/2/7 21:00

原题目网址: this

题目描述翻译:

对于像abcd这样的字符串a,加号操作是非常明显的,即a+a=abcdabcd,但小米定义了一种新的字符串操作方式,那就是减号操作。
对于两个给定的字符串a和b。
如果a的长度不短于b的长度,那么做a-b,否则做b-a。
a-b的意思是通过引用b从a中去掉最长的序列,之后如果b中还有剩余的字符就做a+b,如果一开始就做b-a就做b+a。
比如说
让我们定义A=aabad和B=abc。
那么A-B就是先通过引用B从A中去掉最长的序列,之后A=aad(在索引1处去掉a,在索引3处去掉b,因为如果能去掉一些字符,我们就会马上去掉)之后B=c
然后做A+B,所以A-B=aadc
更准确的说,只从字符串的开头引用到字符串的结尾,并且只会做一次,例如。
假设A=abc,B=acb 引用操作是先检查A[1],很明显A[1]=B[1]=a 所以把A和B中的a都去掉,然后检查A[2],可以看到A[2]!=B[2],所以我们继续引用,然后可以看到A[3]=B[2]=c 所以我们把A和B中的c都去掉,然后我们可以得到A-B的答案是bb

用的机翻,但是阅读没障碍

这是我的代码:

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
string a[1005],b[1005];
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		cin>>b[i];
		int f=a[i].size();
		int s=b[i].size();
		if(f>=s)
		{
			for(int j=0;j<f;j++)
			{
				for(int l=0;l<=j;l++)
				{
					if(a[i][j]==b[i][l])
					{
						a[i][j]='*';
						b[i][l]='*';
						l=0;
						break;
					}
				}
			}
		}
		if(f<s)
		{	
			for(int l=0;l<s;l++)
			{
				for(int j=0;j<=l;j++)
				{
					if(a[i][j]==b[i][l])
					{
						a[i][j]='*';
						b[i][l]='*';
						j=0;
						break;
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		int f=a[i].size();
		int s=b[i].size();	
		if(f>=s)
		{
			for(int j=0;j<f;j++)
			{
				if(a[i][j]!='*')
				{
					cout<<a[i][j];
				}
			}
			for(int l=0;l<s;l++)
			{
				if(b[i][l]!='*')
				{
					cout<<b[i][l];
				}
			}
			if(i==n)
				return 0;
			cout<<"\n";
		}	
		if(f<s)
		{
			for(int l=0;l<s;l++)
			{
				if(b[i][l]!='*')
				{
					cout<<b[i][l];
				}
			}
			for(int j=0;j<f;j++)
			{
				if(a[i][j]!='*')
				{
					cout<<a[i][j];
				}
			}
			if(i==n)
				return 0;
			cout<<"\n";			
		}
	}
	return 0;
} 

但是评测机显示RE

太菜了,不知道为啥,样例完全正确

求大佬给本蒟蒻康一下吧

2021/2/7 21:00
加载中...