C. Saraga
题目链接:https://codeforces.com/problemset/problem/2045/C
题意:
给定两个字符串s,t。构造一个长度最小的字符串使其至少有两个前缀是s的前缀,至少有两个后缀是t的后缀。
思路:
易知构造字符串组成部分:P+Q+R
其中P为s开头字符,R为t结尾字符
P+Q为s前缀,Q+R为t后缀且Q长度大于1
对于下标大于1的s字符串的字符,维护一个map,来映射每个字符出现的最早位置
再从后往前遍历一遍t字符串的字符,当出现了s中出现的字符,此时Q+R子串最小,P+Q子串也最小,由于P和R是固定的,所以此时Q最小,整个字符串长度也就最小了
map<char,int>mp;
void solve(){
string s,t;cin>>s>>t;
int ls=s.size(),lt=t.size();
for(int i=1;i<ls;i++){
if(!mp.count(s[i])){
mp[s[i]]=i;
}
}
int ok=0;int ans=inf,index;
for(int i=lt-2;i>=0;i--){
int len=(lt-1)-i;
if(!mp.count(t[i]))continue;
if(len+mp[t[i]]-1<ans){
ans=len+mp[t[i]]-1;
index=i;
}
ok=1;
}
if(!ok)cout<<-1;
else{
cout<<s[0];
int index1=mp[t[index]];
int index2=index;
for(int i=1;i<index1;i++)cout<<s[i];
for(int i=index2;i<lt;i++)cout<<t[i];
}
}

浙公网安备 33010602011771号