比赛 |
20160415 |
评测结果 |
AAAAAAAAAA |
题目名称 |
字符串 |
最终得分 |
100 |
用户昵称 |
debug |
运行时间 |
1.412 s |
代码语言 |
C++ |
内存使用 |
10.04 MiB |
提交时间 |
2016-04-15 11:34:44 |
显示代码纯文本
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
char f[222222];int siz;int n,m;int tot=-1;int top=0;
struct ff{int x,y,z,num,siz;}e[222222]={};int tot2=0;
struct gg{int x,y,num,num2;}g[222222]={};int temp=n;
int q[222222]={};int ans[222222]={};bool vis[222222]={};
bool cmp1(gg a,gg b){return a.x<b.x;}
bool cmp2(gg a,gg b){return a.y<b.y;}
void slove1(){
for(int i=1;i<=n;i++)
{
scanf("%s",f);
siz=strlen(f);
printf("%lld\n",1LL*siz*(siz+1)/2);
}
}
void slove()
{
int cnt=1;int pos=0;
vis[g[0].num]=1;
for(int i=1;i<=top;i++)
{
if(g[i].x!=g[i-1].x)
{
if(cnt<m)//当前字符不够用
for(int j=pos;j<i;j++)
g[j].x=2147483647,g[j].y=2147483647,vis[g[j].num]=0;
else
for(int j=pos;j<i;j++)
ans[g[j].num]++,vis[g[j].num]=0;
cnt=0;pos=i;
}
if(!vis[g[i].num])
vis[g[i].num]=1,cnt++;
}
if(cnt<m)//当前字符不够用
for(int j=pos;j<=top;j++)
g[j].x=2147483647,vis[g[j].num]=0;
else
for(int j=pos;j<=top;j++)
ans[g[j].num]++,vis[g[j].num]=0;
return;
}
int main()
{
freopen("stringa.in","r",stdin);
freopen("stringa.out","w",stdout);
scanf("%d%d",&n,&m);
if(m==0)
{slove1();return 0;}
for(int ii=1;ii<=n;ii++)
{
scanf("%s",f);
siz=strlen(f);
for(int i=0;i<siz;i++)
e[++tot].x=f[i]-'a',e[tot].num=ii,e[tot].siz=siz;
}
for(int i=0;i<=tot;i++)
g[i].x=e[i].x,g[i].num2=i,g[i].num=e[i].num;
top=tot;
sort(g,g+top+1,cmp1);
slove();
for(int k=1;k<=tot;k++)
{
for(int i=0;i<=top;i++)
if(g[i].num!=e[g[i].num2+k].num||g[i].x==2147483647)//已经不在当前的字符串上,废掉||已经废掉
g[i].y=2147483647,g[i].x=2147483647;
else
g[i].y=g[i].x*27+e[g[i].num2+k].x;
sort(g,g+top+1,cmp2);
g[0].x=1;
for(int i=1;i<=top;i++)
if(g[i].y==g[i-1].y)
g[i].x=g[i-1].x;
else
g[i].x=g[i-1].x+1;
while(top>=0)
if(g[top].y==2147483647)top--;
else break;
slove();
if(top<0)break;
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
return 0;
}