给一个字符串,可以用一个字符代替 模式串,然后求最小的长度
最小的长度要加上模式串的长度。
WNEENWEENEENE
这里面 三个een,所以13-9(三个een)+3(用一个字符替代,挽回三个)+3(een的长度)=10;
kmp模板。。
4-11号看了哲神的暴力模拟法,用了果然对
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{ string a;
string u,w;
int ans;
int cnt;
cin>>a;
int len=a.length();
ans=len;//字符串的长度
for(int i=0;i<len;i++)
{ for(int j=i+1;j<len;j++)//通过i和j卡一个串。
{ cnt=0;//没一种匹配,每次都比较确定最小的值。
u=a.substr(i,j-i);
for(int k=0;k<len;)
{ w=a.substr(k,j-i);
if(w==u)
{ k+=(j-i);//
cnt++;
continue;
}
k++;
}
ans=min(ans,j-i+len-(j-i)*cnt+cnt);
}
}
cout<<ans<<endl;
return 0;
}
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
//#include <bits/stdc++.h>
#include <string>
using namespace std;
string a;
int nex[105];
void getNex(string t)
{
int len = t.length();
memset(nex,-1,sizeof(nex));
int i = 0,k=-1;
while(i<len)
{
if(k==-1 || t[i]==t[k])
{
i++,k++;
nex[i] = k;
}
else
k = nex[k];
}
}
int kmp(string s1,string s2)
{
int len1 = s1.length(),len2 = s2.length();
int i=0,j=0,cnt=0;
getNex(s2);
while(i<len1 && j<len2)
{
if(s1[i]==s2[j])
{
i++;
j++;
if(j==len2)
{
cnt++;
j = 0;
}
}
else if(j==0)
i++;
else
j = nex[j];
}
return cnt;
}
int main()
{ string a;
cin>>a;
int len=a.length();
int sum=len;
for(int i=0;i<len;i++)
{
for(int j=0;j<len;j++)
{ string l=a.substr(i,j+1);
//因为原来是不到j+1的;
int lens=kmp(a,l);
int kk=l.length();
sum=min(sum,len-lens*kk+lens+kk);
}
}
printf("%d\n",sum);
return 0;
}