说无可说

题目描述

“What’s left to say when every word’s been spoken?”
“若沉默再无休止,是否已经说无可说?”
——来自网易云音乐
沉默之中,我已不懂言语。
幻觉中,有人在轻声低吟。
那是谁?
我听见,那个人说了N句话,然而好多话都是重复或者类似,比沉默更加让人不堪。
打破不堪,我想。
每句话是由若干个小写字母组成的字符串。
字符串A和B的相似度定义如下:
<字符串A通过以下三种操作:1、插入一个字符;2、删除一个字符;3、替换一个字符. 变成字符串B的最少操作次数>
比如字符串‘abcd’变成‘ccd’的最少次数是2:
首先,删掉字符“a”得到‘bcd’,然后,将‘b’变成‘c’,得到‘ccd’。
给出N个字符串,求出相似度分别为1,2,3,4,5,6,7,8的字符串对数。

暴力

xjb玄学。
copy标程过~

#include 
#include 
#include 
#include 

#define MAXN 210
#define MAXM 1000010

using namespace std;

string s[MAXN];
int len[MAXN];
char *a;
char *b;
int n;
int ans[10],ans1;

void work(int i,int j,int leni,int lenj,int cnt)
{
    if(cnt+abs(leni-i+j-lenj)>=ans1)return;
    while(iif(a[i]!=b[j])
        {
            work(i+1,j+1,leni,lenj,cnt+1);
            work(i+1,j,leni,lenj,cnt+1);
            work(i,j+1,leni,lenj,cnt+1);
            return;
        }
        i++;j++;
    }
    if(i==leni)ans1=min(ans1,cnt+lenj-j);
    else ans1=min(ans1,cnt+leni-i);
}

int main()
{
    freopen("say.in","r",stdin);
    freopen("say.out","w",stdout);
    scanf("%d",&n);
    for(int i=0;icin>>s[i];
        len[i]=strlen(s[i].c_str());
    }
    for(int i=0;ichar*)s[i].c_str();
        for(int j=i+1;jchar*)s[j].c_str();
            ans1=9;
            work(0,0,len[i],len[j],0);
            ans[ans1]++;
        }
    }
    for(int i=1;i<8;i++)printf("%d ",ans[i]);
    printf("%d\n",ans[8]);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

你可能感兴趣的:(暴力)