5.16模拟赛

T1:string

5.16模拟赛_第1张图片5.16模拟赛_第2张图片5.16模拟赛_第3张图片

样例就不给了反正水的很,当时我看到50的范围有点小激动,用dfs,然而死递归了(我果然什么都不会)

看题面,我似乎忽略了什么重要的东西,有两个容器,为什么是两个,在看数组中不同的符号也是两个,so~~

我们发现可以让一个容器存储'x',让另一个容器存储'o',于是就可以组成所有序列了

又因为容器只能从左边出来再从右进去,就又有办法了我们可以寻找一段最长的串如下:

他满足在初始串的尾部出现又在目标串的头部出现,而且要尽量的长,再把不匹配的字符数量*2就是答案了(出去进来刚好两次)

PS:这当然不是我独立思考的结果,经过了yg大佬的点拨qwq,而且细节应该很少,只要想到就应该A了

code:

#include
using namespace std;
namespace program{
	int T,len,Ans;
	char s1[1010],s2[1010];
	inline bool check(int x){//找最长的匹配串
		for(int i=x+1;i<=len;i++)
			if(s1[i]!=s2[i-x])
				return 0;
		return 1;
	}
	inline void work(){
		cin>>T;
		while(T--){
			scanf("%s%s",s1+1,s2+1);
			len=strlen(s1+1);
			for(int i=0;i<=len;i++){
				if(check(i)){
					Ans=i*2;
					break;
				}
			}
			cout<


你可能感兴趣的:(模拟赛,模拟赛,思维题)