比赛 20160415 评测结果 ATTEEEEEEE
题目名称 字符串 最终得分 10
用户昵称 lxtgogogo 运行时间 2.809 s
代码语言 C++ 内存使用 10.72 MiB
提交时间 2016-04-15 11:51:55
显示代码纯文本
/*
Language: c++
Author: lxtgogogo
Date: 2016.04.15
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<queue>
using namespace std;
inline int read(){
	int x=0;bool f=true;char ch=getchar();
	while(ch>'9' || ch<'0')	{if(ch=='-'){f=false;}ch=getchar();}
	while(ch>='0' && ch<='9')	{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
	return f?x:-x;
}
const int r=1010;
int n=0,kk=0;
char str[110][r]={};
int L[110]={};
int ans[110]={};

struct GTMD{//迷之懵逼
	int nex[26];
	int num;
}tire[100010];
int ge=0;

void getp(int k){
	
}
void init(){
	n=read();kk=read();
	for(int i=1;i<=n;i++)
	{
		scanf("%s",&str[i]);
		int nownode=0;
		while(str[i][L[i]]>='a' && str[i][L[i]]<='z')
		{
			L[i]++;
			int w=str[i][L[i]]-'a';
			if(tire[nownode].nex[w]==0)	tire[nownode].nex[w]=++ge;
			nownode=tire[nownode].nex[w];
		}
		tire[nownode].num++;
	}
}
/*void dfs(int k){
	size[k]=tire[k].num;
	for(int i=0;i<26;i++)
		if(tire[k].nex[i]!=0)
		{
			dfs(tire[k].nex[i]);
			size[k]+=size[tire[k].nex[i]];
		}
}*/
void work1(){
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<L[i];j++)//枚举一个串的所有子串,我决定直接暴力了。。。
			for(int k=j;k<L[i];k++)
			{
				int cnt=0;
				for(int p=1;p<=n;p++)
				{
					if(cnt>=kk)	break;
					for(int h=0;h<L[p];h++)
						if(str[p][h]==str[i][j])
						{
							bool flag=true;
							for(int l=1;l<=k-j;l++)
								if(str[p][h+l]!=str[i][j+l])	{flag=false;break;}
							if(flag)	{cnt++;break;}
						}
				}
				if(cnt>=kk)	ans[i]++;
			}
	}
	for(int i=1;i<=n;i++)
		printf("%d ",ans[i]);
	printf("\n");
}
void work2(){
	for(int i=1;i<=n;i++)
		printf("%d ",L[i]*(L[i]-1));
	printf("\n");
}
int main(){
	freopen("stringa.in","r",stdin);
	freopen("stringa.out","w",stdout);
	
	init();
	if(n<=100)	work1();
	else work2();
	
	fclose(stdin);fclose(stdout);
	return 0;
}