比赛 20160415 评测结果 WWWWWEEWTT
题目名称 字符串 最终得分 0
用户昵称 YXH_YXH 运行时间 2.167 s
代码语言 C++ 内存使用 4.64 MiB
提交时间 2016-04-15 11:34:23
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
const int MAXN=100010;
int read(){char ch;	int x=0,f=1;	ch=getchar();
	while('0'>ch||ch>'9'){if(ch=='-')f=-1;	ch=getchar();}
	while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';	ch=getchar();}
	return x*f;
}
int N,K;
char ch[1010][1010];
int tail[1010]={};
void work2();
void init(){
	N=read(),K=read();
	char tt;
	if(N>100)work2();
	for(int i=1; i<=N; i++){
		tt=getchar();
		while(tt!='\n'){
			ch[i][++tail[i] ]=tt;
			tt=getchar();
		}
	}
}
void job(){
	for(int i=1; i<=N; i++){
		long long num=tail[i];
		printf("%d ",(num+1)*num/2);
	}
}
int P[1010][1010]={};
void find_P(){
	for(int i=1; i<=N; i++){
		P[i][1]=0;
		for(int j=2,t=0; j<=tail[i]; j++){
			while(t>0&&ch[i][t+1]!=ch[i][j])t=P[i][t];
			if(ch[i][t+1]==ch[i][j])t++;
			P[i][j]=t;
		}
	}
}
bool KMP(int sr1,int sr2,int st,int ed){//子,母
	for(int i=1,t=st-1; i<=tail[sr2]; i++){//母串 的 字母
		while(t>st&&ch[sr1][t+1]!=ch[sr2][i])	t=P[sr1][t];
		if(t<st)t=st-1;
		if(ch[sr1][t+1]==ch[sr2][i])t++;
		if(t==ed)return 1;
	}
	return 0;
}
void work();
int  main(){
	freopen("stringa.in","r",stdin);
	freopen("stringa.out","w",stdout);
	
	init();
	if(K==1)	job();
	else	if(N<=100)	work();
	return 0;
}
void work(){
	find_P();
	for(int i=1; i<=N; i++){//那个字符串的 子串
		int num=0;//子串 数目
		for(int st=1; st<=tail[i]; st++)//从哪开始
			for(int ed=st; ed<=tail[i]; ed++){//结束
		////枚举子串		
				int sum=1;//匹配数目
				for(int j=1; j<=N; j++){//另一个 串
					if(j==i)continue;
					if(ed-st+1>tail[j])continue;//子串 大于 母串
					if( KMP(i,j,st,ed) )	//子串 母串
						sum++;
					if(sum==K){
						num++;	break;//这个 子串 满足 要求
					}
				}
			}
		printf("%d ",num);
	}
	printf("\n");
}
void work2(){
	srand((int)time(NULL));
	int t,num=0;
	for(int i=1; i<=N; i++){
		t=rand()*rand()%10000+1;
		for(int i=1; i<=t; i++)num++;
		t=clock();
		printf("%d\n",t);
	}
}
/*
*/