Gym

来源:互联网 发布:啪嗒砰3召唤奇迹数据 编辑:程序博客网 时间:2024/05/22 23:53

给一个字符串,可以用一个字符代替 模式串,然后求最小的长度
最小的长度要加上模式串的长度。
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;}
0 0
原创粉丝点击