Advertisement
daksh_ddt

Slash the string-tester

Nov 10th, 2014
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.66 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<iostream>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. void computeLPSArray(char *pat, int M, int *lps);
  10.  
  11. int KMPSearch(char *pat, char *txt)
  12. {
  13.     int M = strlen(pat);
  14.     int N = strlen(txt);
  15.     int *lps = (int *)malloc(sizeof(int)*M);
  16.     int j  = 0;  
  17.     computeLPSArray(pat, M, lps);
  18.     int ma=0;
  19.     int i = 0;  
  20.     while (i < N)
  21.     {
  22.       if (pat[j] == txt[i])
  23.       {
  24.         j++;
  25.         i++;
  26.       }
  27.       if (j > ma)
  28.       {
  29.         //printf("Found pattern at index %d \n", i-j);
  30.         ma=j;
  31.         //j = lps[j-1];
  32.       }
  33.  
  34.       else if (i < N && pat[j] != txt[i])
  35.       {
  36.         if (j != 0)
  37.          j = lps[j-1];
  38.         else
  39.          i = i+1;
  40.       }
  41.     }
  42.     free(lps);
  43.     return ma;
  44. }
  45.  
  46. void computeLPSArray(char *pat, int M, int *lps)
  47. {
  48.     int len = 0;  
  49.     int i;
  50.  
  51.     lps[0] = 0;
  52.     i = 1;
  53.     while (i < M)
  54.     {
  55.        if (pat[i] == pat[len])
  56.        {
  57.          len++;
  58.          lps[i] = len;
  59.          i++;
  60.        }
  61.        else
  62.        {
  63.          if (len != 0)
  64.          {
  65.            len = lps[len-1];
  66.          }
  67.          else
  68.          {
  69.            lps[i] = 0;
  70.            i++;
  71.          }
  72.        }
  73.     }
  74. }
  75. int dp[2005];
  76. int dp2[2005];
  77. char p[2005];
  78. char ch[2005];
  79. int main()
  80. {
  81.     int t;
  82.     cin>>t;
  83.     while(t--)
  84.     {
  85.         int j,ans=0,i;
  86.         string s;
  87.         cin>>s;
  88.         int curi=0,curj=s.length(),tot=0;
  89.         while(curi<curj)
  90.         {
  91.             //printf("%d %d\n",curi,curj);
  92.             memset(dp,0,sizeof(dp));
  93.             int pos=-1;
  94.             for(i=curi;i<curj;i++)
  95.             {
  96.                 int len=0;
  97.                 for(j=i+1;j<curj;j++)
  98.                 {
  99.                     p[len]=s[j-1];
  100.                     ch[len++]=s[j];
  101.                 }
  102.                 p[len]=s[j-1];
  103.                 ch[len]='\0';
  104.                 len++;
  105.                 p[len]='\0';
  106.                 int val=KMPSearch(p,ch);
  107.                 if(val==0)
  108.                     break;
  109.                 pos=i;
  110.                 dp[i]=val;
  111.             }
  112.             for(i=0;i<2001;i++)
  113.                 dp2[i]=10000;
  114.             if(pos>0)
  115.             {
  116.                 dp2[curi]=0;
  117.                 for(i=curi;i<pos+1;i++)
  118.                 {
  119.                     for(j=1;j<=dp[i];j++)
  120.                         dp2[j+i]=min(dp2[j+i],dp2[i]+1);
  121.                 }
  122.                 curi=pos+1;
  123.                 ans=ans+dp2[pos+1];
  124.             }
  125.             int pr=0;
  126.             for(j=curi;j<curj-1;j++)
  127.                 ch[pr++]=s[j];
  128.             ch[pr]='\0';
  129.             int fl=0;
  130.             int yy=0;
  131.             //printf("curi-> %d\n",curi);
  132.             for(i=curj-1;i>=0;i--)
  133.             {
  134.                 int len=0;
  135.                 for(j=i;j<curj;j++)
  136.                 {
  137.                     p[len++]=s[j];
  138.                 }
  139.                 p[len]='\0';
  140.                 //printf("%s %s\n",p,ch);
  141.                 int val=KMPSearch(p,ch);
  142.                 //printf("%d\n",val);
  143.                 if(val==len){
  144.                     fl=1;
  145.                     yy=i;
  146.                 }
  147.                 else
  148.                     break;
  149.             }
  150.             if(fl)
  151.             {
  152.                 curj=yy;
  153.             }
  154.             else
  155.                 curi++;
  156.             //printf("%d %d\n",curi,curj);
  157.             ans++;
  158.             //tot=1;
  159.         }
  160.         printf("%d\n",ans);
  161.     }
  162.     return 0;
  163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement