Topcoder SRM 392 Div1 250

题意:给两个字符串A,B,A和B都含有小写英文字母,同时都额外含有且仅含有一个字符 ,现希望将A,B中的字符 分别替换成其它字符串(可以不同,可以相同,可以为空),使得A=B,且要求最终的A, B串(A=B)最短。或者输出不可能。

解法:让A串作为 号更靠前的串,如果A的 号之前的字符存在一个与B对应位置不同,则不可能,如果B的 号之后的字符存在一个与A对应位置不同,则不可能。否则一定有解,暴力找到最优解即可。这题可以用hash或extend-kmp的方法,达到复杂度O(N)级别,但实现有点麻烦,O(N^2)写法简单容易。

My Code

#include<algorithm>
#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef long long ll;

class TwoStringMasks{
public:
    string shortestCommon(string s1, string s2){
        int t1 = 0, t2 = 0;
        for(int i = 0; i < s1.length(); i++) if(s1[i] == '*') t1 = i;
        for(int i = 0; i < s2.length(); i++) if(s2[i] == '*') t2 = i;
        if(t1 > t2) swap(s1, s2);

        string ans1 = "", ans3 = "";
        for(int i = 0; i < s1.length(); i++) if(s1[i] == '*') ans1 = s1.substr(0, i);
        for(int i = 1; i < s2.length(); i++) if(s2[i-1] == '*') ans3 = s2.substr(i, s2.length() - i);

        while(s1[0] != '*' && s2[0] != '*')
        {
            if(s1[0] != s2[0]) return "impossible";
            s1.erase(0, 1), s2.erase(0, 1);
        }
        while(s1.back() != '*' && s2.back() != '*')
        {
            if(s1.back() != s2.back()) return "impossible";
            s1.pop_back(), s2.pop_back();
        }
        s1.erase(0, 1);

        string ans = ".";
        for(int i = -1; i < (int)s2.length(); i++)
        {
            if(i >= 0 && s2[i] == '*') break;
            string s3; s3.clear();
            for(int j = 0; j <= i; j++) s3 += s2[j];
            s3 += s1;

            bool ok = 1;
            int t3 = 0, t2 = 0;
            while(t3 < s3.length() && t2 < s2.length() && ok)
            {
                if(s2[t2] == '*') break;
                else if(s3[t3] != s2[t2]) ok = 0;
                else t3++, t2++;
            }
            if(s2[t2] != '*') ok = 0;
            if(ok && (ans == "." || ans.length() > (ans1 + s3 + ans3).length()))
            {
                ans = ans1 + s3 + ans3;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(Topcoder SRM 392 Div1 250)