题目链接: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];}
}