记录编号 251097 评测结果 AAAAAAAAAA
题目名称 字符串 最终得分 100
用户昵称 Gravatardydxh 是否通过 通过
代码语言 C++ 运行时间 0.317 s
提交时间 2016-04-16 21:03:03 内存使用 26.35 MiB
显示代码纯文本
  1. /*
  2. Problem:String;
  3. Language:c++;
  4. by dydxh;
  5. Date:2016.04.16;
  6. */
  7. #include<algorithm>
  8. #include<iostream>
  9. #include<cstring>
  10. #include<utility>
  11. #include<cstdlib>
  12. #include<cstdio>
  13. #include<string>
  14. #include<vector>
  15. #include<ctime>
  16. #include<cmath>
  17. #include<queue>
  18. #include<map>
  19. #include<set>
  20. #define ll long long
  21. #define ull unsigned long long
  22. using namespace std;
  23. const int oo=2000000000;
  24. const int maxn=100005;
  25. int n,K;
  26. int S[maxn],T[maxn];
  27. char Str[maxn];
  28. struct Suffix_AutoMaton{
  29. int Last,Cnt;
  30. int Tor[maxn<<1][27],Val[maxn<<1],Par[maxn<<1];
  31. int Col[maxn<<1],Vis[maxn<<1];
  32. ll Num[maxn<<1];
  33. void Initialize(){Last=Cnt=1;}
  34. void Expand(int x){
  35. int p=Last,np=++Cnt;Val[np]=Val[p]+1;
  36. while(p && Tor[p][x]==0) Tor[p][x]=np,p=Par[p];
  37. if(p==0) Par[np]=1;
  38. else{
  39. int q=Tor[p][x];
  40. if(Val[q]==Val[p]+1) Par[np]=q;
  41. else{
  42. int nq=++Cnt;Val[nq]=Val[p]+1;
  43. memcpy(Tor[nq],Tor[q],sizeof(Tor[nq]));
  44. Par[nq]=Par[q],Par[np]=Par[q]=nq;
  45. while(p && Tor[p][x]==q) Tor[p][x]=nq,p=Par[p];
  46. }
  47. }
  48. Last=np;
  49. }
  50. void Color(int Now,int Sign){
  51. while(Now){
  52. if(Vis[Now]==Sign) break;
  53. Vis[Now]=Sign,Col[Now]++;
  54. Now=Par[Now];
  55. }
  56. }
  57. ll Finder(int x){
  58. if(x==0) return 0;
  59. if(Vis[x]) return Num[x];
  60. Vis[x]=1,Num[x]=Finder(Par[x]);
  61. if(Col[x]>=K) Num[x]+=Val[x]-Val[Par[x]];
  62. return Num[x];
  63. }
  64. }Sam;
  65. void Initialize(){
  66. Sam.Initialize();
  67. scanf("%d %d\n",&n,&K);
  68. for(int i=1;i<=n;i++){
  69. S[i]=T[i-1]+1;
  70. scanf("%s\n",Str+S[i]);
  71. T[i]=strlen(Str+S[i])+S[i]-1;
  72. Sam.Last=1;
  73. for(int j=S[i];j<=T[i];j++){
  74. if(Sam.Tor[Sam.Last][S[j]-'a'+1] && Sam.Val[Sam.Last]==j-S[i]+1)
  75. Sam.Last=Sam.Tor[Sam.Last][S[j]-'a'+1];
  76. else Sam.Expand(Str[j]-'a'+1);
  77. }
  78. }
  79. }
  80. void Colorful(){
  81. for(int i=1;i<=n;i++){
  82. int Now=1;
  83. for(int j=S[i];j<=T[i];j++){
  84. Now=Sam.Tor[Now][Str[j]-'a'+1];
  85. Sam.Color(Now,i);
  86. }
  87. }
  88. memset(Sam.Vis,0,sizeof(Sam.Vis));
  89. }
  90. int main(){
  91. freopen("stringa.in","r",stdin);
  92. freopen("stringa.out","w",stdout);
  93. Initialize();
  94. Colorful();
  95. for(int i=1;i<=n;i++){
  96. int Now=1;ll Ans=0;
  97. for(int j=S[i];j<=T[i];j++){
  98. Now=Sam.Tor[Now][Str[j]-'a'+1];
  99. Ans+=Sam.Finder(Now);
  100. }
  101. printf("%lld ",Ans);
  102. }
  103. printf("\n");
  104. //cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
  105. return 0;
  106. }