记录编号 251097 评测结果 AAAAAAAAAA
题目名称 字符串 最终得分 100
用户昵称 Gravatardydxh 是否通过 通过
代码语言 C++ 运行时间 0.317 s
提交时间 2016-04-16 21:03:03 内存使用 26.35 MiB
显示代码纯文本
/*
Problem:String;
Language:c++;
by dydxh;
Date:2016.04.16;
*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<utility>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<vector>
#include<ctime>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define ull unsigned long long
using namespace std;
const int oo=2000000000;
const int maxn=100005;
int n,K;
int S[maxn],T[maxn];
char Str[maxn];
struct Suffix_AutoMaton{
	int Last,Cnt;
	int Tor[maxn<<1][27],Val[maxn<<1],Par[maxn<<1];
	int Col[maxn<<1],Vis[maxn<<1];
	ll Num[maxn<<1];
	void Initialize(){Last=Cnt=1;}
	void Expand(int x){
		int p=Last,np=++Cnt;Val[np]=Val[p]+1;
		while(p && Tor[p][x]==0) Tor[p][x]=np,p=Par[p];
		if(p==0) Par[np]=1;
		else{
			int q=Tor[p][x];
			if(Val[q]==Val[p]+1) Par[np]=q;
			else{
				int nq=++Cnt;Val[nq]=Val[p]+1;
				memcpy(Tor[nq],Tor[q],sizeof(Tor[nq]));
				Par[nq]=Par[q],Par[np]=Par[q]=nq;
				while(p && Tor[p][x]==q) Tor[p][x]=nq,p=Par[p];
			}
		}
		Last=np;
	}
	void Color(int Now,int Sign){
		while(Now){
			if(Vis[Now]==Sign) break;
			Vis[Now]=Sign,Col[Now]++;
			Now=Par[Now];
		}
	}
	ll Finder(int x){
		if(x==0) return 0;
		if(Vis[x]) return Num[x];
		Vis[x]=1,Num[x]=Finder(Par[x]);
		if(Col[x]>=K) Num[x]+=Val[x]-Val[Par[x]];
		return Num[x];
	}
}Sam;
void Initialize(){
	Sam.Initialize();
	scanf("%d %d\n",&n,&K);
	for(int i=1;i<=n;i++){
		S[i]=T[i-1]+1;
		scanf("%s\n",Str+S[i]);
		T[i]=strlen(Str+S[i])+S[i]-1;
		Sam.Last=1;
		for(int j=S[i];j<=T[i];j++){
			if(Sam.Tor[Sam.Last][S[j]-'a'+1] && Sam.Val[Sam.Last]==j-S[i]+1)
				Sam.Last=Sam.Tor[Sam.Last][S[j]-'a'+1];
			else Sam.Expand(Str[j]-'a'+1);
		}
	}
}
void Colorful(){
	for(int i=1;i<=n;i++){
		int Now=1;
		for(int j=S[i];j<=T[i];j++){
			Now=Sam.Tor[Now][Str[j]-'a'+1];
			Sam.Color(Now,i);
		}
	}
	memset(Sam.Vis,0,sizeof(Sam.Vis));
}
int main(){
	freopen("stringa.in","r",stdin);
	freopen("stringa.out","w",stdout);
	Initialize();
	Colorful();
	for(int i=1;i<=n;i++){
		int Now=1;ll Ans=0;
		for(int j=S[i];j<=T[i];j++){
			Now=Sam.Tor[Now][Str[j]-'a'+1];
			Ans+=Sam.Finder(Now);
		}
		printf("%lld ",Ans);
	}
	printf("\n");
	//cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
    return 0;
}