UVa 140 Bandwidth


设出现的字母数为 \(n\),注意到 \(n\) 很小(\(n\leq8\)),因此枚举全排列即可,尽管可以 DFS 然后剪枝。时间复杂度为 \(\mathcal O(n!n)\)

这题在洛谷上评蓝...主要难点在于奇葩的输入格式。我们考虑按顺序遍历 \(\mathtt{A\sim Z}\),把在读入字符串中出现的分别以编号和实体的方式存进数组 \(\text{id[],letter[]}\),这方便我们之后按顺序计算全排列。

然后,遍历读入的字符串,设置两个指针 \(p,q\),其中 \(p\) 每次遇到一个:再停下来;\(q\) 每次遇到一个;再停下来;然后 \(\text s[p\sim q]\) 构成了一组对应关系。设置两个 vector \(u,v\),遍历 \([p+1,q-1]\) ,每次u.push_back(id[(int)s[p-1]]);v.push_back(id[(int)s[i]]);。这样,在之后计算带宽时,就可以通过这两个 vector 找到距离。

在计算带宽时,还要记得把对应字母的位置记录一下。

#include
#include
#include
#include
#include
#include
using namespace std;
int id[1050],letter[15];
int main()
{
    char s[1050];
    while(scanf("%s",s)==1&&s[0]!='#')
    {
        int n=0;
        for(char ch='A';ch<='Z';ch++)
        {
            if(strchr(s,ch)!=NULL)
            {
                id[(int)ch]=n++;
                letter[id[(int)ch]]=(int)ch;
            }
        }
        int len=strlen(s),p=0,q=0;
        vectoru,v;
        while(1)
        {
            while(p %d\n",ans);
    }
    return 0;
}

相关