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];
	}
}
posted @ 2025-03-22 18:51  Marinaco  阅读(18)  评论(0)    收藏  举报
//雪花飘落效果