说无可说

来源:互联网 发布:杨梅红美校评价 知乎 编辑:程序博客网 时间:2024/04/27 04:09

题目描述

“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 <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define MAXN 210#define MAXM 1000010using 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(i<leni&&j<lenj)    {        if(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;i<n;i++)    {        cin>>s[i];        len[i]=strlen(s[i].c_str());    }    for(int i=0;i<n;i++)    {        a=(char*)s[i].c_str();        for(int j=i+1;j<n;j++)        {            b=(char*)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;}
原创粉丝点击