CF1146B 题解

发布时间 2024-01-06 19:13:42作者: lemon-cyy

题目简述

给定一个字符串 \(t\),由一个字符串 \(s\) 和这个字符串去掉所有 a 组成。求字符串 \(s\)

思路

首先我们分析给定的字符串 \(t\),它由 \(s\)\(s\) 去掉所有 a 形成的字符串 \(s'\) 组成。那么当整个字符串 \(t\) 去掉 a 后,就得到了 \(s'+s'\) 的格式,即可以找到其中的连接点。

举个例子来看。

ababacacbbcc 去掉所有 a 后得到了 bbccbbcc

\(s'\)bbcc

\(s\) 就是 ababacac

实现细节

一定要注意很有可能 \(t\) 去掉 a 后产生了两个相同的字符串,但实际上 a 也出现在了后半对称部分,此时是不合法的。

我们的解决方案就是记录最后一次 a 出现的位置,与得到的 \(s\) 做比对。

AC 代码


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s,t;
ll b;

void input(){
	cin>>s;
} 

void solve(){
	for(ll i=0;i<s.size();i++){
		if(s[i]=='a') b=t.size();
		else t+=s[i];
	}
	ll l=t.size();
	if(l%2==1||b>l/2){
		cout<<":(";
		return;
	}
	for(ll i=0;i<l/2;i++){
		if(t[i]!=t[i+l/2]){
			cout<<":(";
			return;
		}
	}
	for(ll i=0;i<s.size()-l/2;i++){
		cout<<s[i];
	}
}

int main(){
	input();
	solve();
	return 0;
}