首页 > 其他 > 详细

kmp练习

时间:2019-03-15 13:16:28      阅读:151      评论:0      收藏:0      [点我收藏+]

先贴个lrj的板子, kmp基本照这个写了, 其中f数组表示失配后应转移的新状态

int main() {
	scanf("%s%s", t, p);
	int n = strlen(t), m = strlen(p);
	f[0]=f[1]=0;
	REP(i,1,m-1) {
		int j = f[i];
		while (j&&p[i]!=p[j]) j=f[j];
		if (p[i]==p[j]) ++j;
		f[i+1] = j;
	}
	int j = 0;
	REP(i,0,n-1) {
		while (j&&p[j]!=t[i]) j=f[j];
		if (p[j]==t[i]) ++j;
		if (j==m) printf("%d", i-m+1);
	}
}

 

练习1: hdu5763

大意: 给定字符串T, 模板串P, 可以将T中与P匹配的子串替换为‘*‘, 求多少种替换方案.

一个板子题, kmp求出可以替换的位置, 然后dp就好了

const int N = 1e6+10;
char t[N], p[N];
int f[N], ff[N], *dp=ff+1;
void add(int &a, int b) {a+=b;if (a>=P) a-=P;}

void work() {
	scanf("%s%s", t, p);
	int n = strlen(t), m = strlen(p);
	f[0]=f[1]=0;
	REP(i,1,m-1) {
		int j = f[i];
		while (j&&p[i]!=p[j]) j=f[j];
		if (p[i]==p[j]) ++j;
		f[i+1] = j;
	}
	int j = 0;
	dp[-1] = 1;
	REP(i,0,n-1) {
		while (j&&p[j]!=t[i]) j=f[j];
		if (p[j]==t[i]) ++j;
		dp[i] = 0;
		if (j==m) add(dp[i],dp[i-m]);
		add(dp[i],dp[i-1]);
	}
	printf("%d\n",dp[n-1]);
}

int main() {
	int t;
	scanf("%d", &t);
	REP(i,1,t) printf("Case #%d: ",i),work();
}

 

 

练习2 CF825F

大意: 给定字符串$s$, 可以将连续$c1$个相同的子串$s1$压缩为|c1|+|s1|, 求压缩若干次后$s$最短长度.

字符串循环节板子, 假设一个长$n$的字符串$s$, 失配函数为$f$, 则循环节为n-f[n]或n

const int N = 8e3+10;
int n;
char s[N];
int f[N], g[N][N], ff[N], *dp=ff+1;
void getFail(char *s) {
	int m = strlen(s);
	f[0]=f[1]=0;
	REP(i,1,m-1) {
		int j=f[i];
		while (j&&s[i]!=s[j]) j=f[j];
		if (s[i]==s[j]) ++j;
		f[i+1] = j;
	}
}
int calc(int x) {int r=0;while (x) ++r,x/=10;return r;}

int main() {
	scanf("%s", s);
	n = strlen(s);
	REP(i,0,n-1) {
		getFail(s+i);
		REP(j,i,n-1) {
			int len = j-i+1;
			if (len%(len-f[len])==0) g[i][j]=len-f[len]+calc(len/(len-f[len]));
			else g[i][j]=len+1;
		}
	}
	dp[-1] = 0;
	REP(i,0,n-1) {
		dp[i] = INF;
		REP(j,0,i) dp[i] = min(dp[i], dp[j-1]+g[j][i]);
	}
	printf("%d\n", dp[n-1]);
}

 

kmp练习

原文:https://www.cnblogs.com/uid001/p/10536194.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!