题目描述
“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 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(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;
}