比赛 |
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);
}
}
/*
*/