CF1146B 题解
题目简述
给定一个字符串 \(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;
}
本文来自博客园,作者:lemon-cyy,转载请注明原文链接:https://www.cnblogs.com/lemon-cyy/p/17949391