-
E - Red Rover
- Gym - 101196E
- 题意:给你一个字符串s,让你找一个子串s1,把s中所有出现过的s1都替代成字符M,问你能使字符串s+s1变成多短,输出最短的长度
- 暴力所有字串kmp查询即可
-
#include<bits/stdc++.h> using namespace std; #define maxn 500 #define inf 0x3f3f3f3f char str[maxn],son[maxn]; int len,cnt,ans=inf,nxt[maxn]; void getnxt(int m) { int i=0,j=-1; nxt[0]=-1; while(i<m) { while(j!=-1&&son[i]!=son[j]) j=nxt[j]; nxt[++i]=++j; } } int kmp(int m) { int i=0,j=0,sum=0; while(i<len) { while(j!=-1&&str[i]!=son[j]) j=nxt[j]; i++; j++; if(j>=m) { sum++; j=0; } } return sum; } int main() { scanf("%s",str); len=strlen(str); for(int i=1; i<len; i++) { cnt=0; for(int j=i; j<len; j++) { son[cnt++]=str[j]; getnxt(cnt); ans=min(ans,cnt+len-(cnt-1)*kmp(cnt)); } } ans=min(ans,len); printf("%d\n",ans); return 0; }
E - Red Rover Gym -KMP-不重叠子串出现次数
最新推荐文章于 2022-08-23 15:01:41 发布