其他分享
首页 > 其他分享> > 统计单词个数

统计单词个数

作者:互联网

#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int len = 0;
char s[300];
int p, k;
char wl;
void dr() {
	while (p--) {
		for (int i = 0; i < 20; i++) {
			scanf(" %c", &wl);
			s[len++] = wl;
		}
	}
}
char dt[10][300] = {0};
int gs;
int kmp[10][300] = {0};
int ln[10];
bool visit[300];
int curMatch[10];
int sum;
int ct(int l, int r) {
	sum = 0;
	memset(visit, false, sizeof(visit));
	memset(curMatch, 0, sizeof(curMatch));
	for (int i = l; i <= r; i++) {
		for (int j = 0; j < gs; j++) {
			while (curMatch[j] && s[i] != dt[j][curMatch[j]])curMatch[j] = kmp[j][curMatch[j]];
			if (s[i] == dt[j][curMatch[j]])curMatch[j]++;
			if (curMatch[j] == ln[j] && !visit[i - ln[j] + 1]) {
				visit[i - ln[j] + 1] = true;
				sum++;
			}
		}
	}
	return sum;
}
int main() {
	scanf("%d%d", &p, &k);
	dr();
	scanf("%d", &gs);
	for (int i = 0; i < gs; i++)scanf("%s", dt[i]);
	int x;
	for (int i = 0; i < gs; i++) { //
		kmp[i][0] = kmp[i][1] = 0;
		ln[i] = strlen(dt[i]);
		x = 0;
		for (int j = 1; j < ln[i]; j++) {
			while (x && dt[i][x] != dt[i][j])x = kmp[i][x];
			kmp[i][j + 1] = dt[i][x] == dt[i][j] ? ++x : 0;
		}
	}
	int f[300][300] = {0};
	for (int i = 0; i < len; i++) {
		for (int j = 1; j <= k; j++) {
			if (j == 1) {
				f[i][j] = ct(0, i); //
			}            else {
				for (int k = 0; k < i; k++) {
					if (f[k][j - 1])
						f[i][j] = max(f[i][j], f[k][j - 1] + ct(k + 1, i)); //
				}
			}
		}
	}
	printf("%d", f[len - 1][k]); //
	return 0;
}

标签:10,char,int,visit,个数,单词,300,include,统计
来源: https://www.cnblogs.com/jeseesmith/p/15836154.html