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