Advertisement
NikitaM

Mintruth

Jun 22nd, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.69 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define sz 100000
  4. int max(int a,int b){
  5. return (a>b)?a:b;
  6. }
  7. int pi[sz];
  8. char s[sz], buff[sz], ans[sz];
  9. int find(int m, int n, int l){
  10. memset(pi,0,sizeof(int)*m);
  11. for(int i=1; i<m; ++i){
  12. int k=pi[i-1];
  13. while(k>0 && buff[i]!=buff[k])
  14. k=pi[k-1];
  15. if(buff[k]==buff[i])
  16. ++k;
  17. pi[i]=k;
  18. }
  19. int k=0, pos=-1;
  20. if(s[0]==buff[0]){
  21. ++k;
  22. if(m==1)
  23. return l;
  24. }
  25. for(int i=1; i<n; ++i){
  26. if (k==m)
  27. k=pi[k-1];
  28. while (k>0 && buff[k]!=s[i])
  29. k=pi[k-1];
  30. if(buff[k]==s[i])
  31. ++k;
  32. if (k==m && i-m+1>=l)
  33. return i-m+1;
  34. }
  35. return -1;
  36.  
  37. }
  38. int main(){
  39.  
  40. char c=getchar();
  41. int n=0;
  42. while(c!='\n'){
  43. s[n]=c;
  44. ++n;
  45. c=getchar();
  46. }
  47. memcpy(ans,s,n);
  48. c=getchar();
  49. int left=0;
  50. while(true){
  51. while(c==' ')
  52. c=getchar();
  53. int m=0;
  54. while (c!='\n'&&c!=' '){
  55. buff[m]=c;
  56. ++m;
  57. c=getchar();
  58. }
  59. if(m==0)
  60. break ;
  61. int pos=find(m,n,left);
  62. if (pos==-1){
  63. puts("I HAVE FAILED!!!");
  64. return 0;
  65. }
  66. for(int i=max(left-1,0);i<pos;++i)
  67. if(s[i]!=' ')
  68. ans[i]='_';
  69. left=pos+m+1;
  70. }
  71. if(left>0)
  72. for(int i=left-1;i<n;++i)
  73. if(s[i]!=' ')
  74. ans[i]='_';
  75. for(int i=0; i<n; ++i)
  76. putchar(ans[i]);
  77. return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement