iscsi

hackerrank iso

Oct 27th, 2013
570
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.45 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <cctype>
  12. #include <cmath>
  13. #include <cstring>
  14. #include <ctime>
  15. #include <cassert>
  16. #include <limits>
  17. using namespace std;
  18. typedef long long LL;
  19. #define FOR(k,a,b) for(int k(a); k < (b); ++k)
  20. #define FORD(k,a,b) for(int k(a); k >= (b); --k)
  21. #define REP(k,a) for(int k=0; k < (a); ++k)
  22. #define ABS(a) ((a)>0?(a):-(a))
  23.  
  24. typedef vector<int> VI;
  25. typedef vector<vector<int> > VVI;
  26. typedef vector<vector<bool> > VVB;
  27.  
  28. LL powmod(LL a, LL b,LL p)
  29. {
  30.         LL tmp=a;
  31.         LL res=1;
  32.         while(b)
  33.         {
  34.                 if(b&1)
  35.                 {
  36.                         res*=tmp;
  37.                         res%=p;
  38.                 }
  39.                 tmp*=tmp;
  40.                 tmp%=p;
  41.                 b>>=1;
  42.         }
  43.         return res;
  44. }
  45.  
  46. int main()
  47. {
  48. #ifdef HOME
  49.         freopen ("in.txt","r",stdin);
  50.         freopen ("out.txt","wb",stdout);
  51. #endif
  52.         char cc[100009];
  53.         scanf("%s",cc);
  54.         int N=strlen(cc);
  55.         int tmp,ctr;
  56.         vector<vector<int> > perm(26,vector<int> (N));
  57.         vector<int> llast(26);
  58.         map<int,int> ml;
  59.         map<int,int>::iterator mit;
  60.         REP(i,26)
  61.         {
  62.                 llast[i]=1e6+i;
  63.                 ml[llast[i]]=i;
  64.         }
  65.         for(int i=N-1;i>-1;--i)
  66.         {
  67.                 tmp=cc[i]-'a';
  68.                 ctr=1;
  69.                 ml.erase(llast[tmp]);
  70.                 llast[tmp]=i;
  71.                 ml[i]=tmp;
  72.                 for(mit=ml.begin();mit!=ml.end();++mit)
  73.                 {
  74.                         perm[mit->second][i]=ctr;
  75.                         ++ctr;
  76.                 }
  77.         }
  78.         vector<int> v(N,1e6);
  79.         LL mod1=1e9+7, factor1=37;
  80.         vector<LL> factors1(1e5+2);
  81.         factors1[0]=1;
  82.         LL inversefactor1=powmod(factor1,mod1-2,mod1);
  83.         FOR(i,1,factors1.size())
  84.                 factors1[i]=(factors1[i-1]*factor1)%mod1;
  85.         map<pair<int,LL>,int> hash;
  86.         hash[make_pair(0,0)]=0;
  87.         hash[make_pair(1,1)]=0;
  88.         v[0]=1;
  89.         int currlen=1, actsimilar=0;
  90.         vector<LL> w1(26);
  91.         w1[cc[1]-'a']++;
  92.         FOR(st,1,N)
  93.         {
  94.                 //calculate actual hash
  95.                 LL currhash=0;
  96.                 REP(i,26)
  97.                 {
  98.                         currhash+=w1[i]*perm[i][st];
  99.                         currhash%=mod1;
  100.                 }
  101.                 //find the first isomorph substring to the current
  102.                 while(hash.count(make_pair(currlen,currhash)))
  103.                 {
  104.                         actsimilar=hash[make_pair(currlen,currhash)];
  105.                         for(++currlen;st+currlen<=N;++currlen)
  106.                         {
  107.                                 w1[cc[st+currlen-1]-'a']+=factors1[currlen-1];
  108.                                 if(w1[cc[st+currlen-1]-'a']>=mod1)
  109.                                         w1[cc[st+currlen-1]-'a']-=mod1;        
  110.                                 currhash+=factors1[currlen-1]*perm[cc[st+currlen-1]-'a'][st];
  111.                                 currhash%=mod1;
  112.                                 if(perm[cc[actsimilar+currlen-1]-'a'][actsimilar]!=perm[cc[st+currlen-1]-'a'][st])
  113.                                 {
  114.                                         break;
  115.                                 }
  116.                          }
  117.                 }
  118.                 if(currlen+st>N)
  119.                         break;
  120.                 assert(!hash.count(make_pair(currlen,currhash)));
  121.                 hash[make_pair(currlen,currhash)]=st;//insert current hash
  122.                 //insert other hash direction
  123.                 currhash+=(mod1-factors1[currlen-1])*perm[cc[st+currlen-1]-'a'][st];
  124.                 currhash%=mod1;
  125.                 currhash+=(factors1[currlen-1])*perm[cc[actsimilar+currlen-1]-'a'][actsimilar];
  126.                 currhash%=mod1;
  127.                 if(!hash.count(make_pair(currlen,currhash)))
  128.                 {
  129.                         hash[make_pair(currlen,currhash)]=actsimilar;
  130.                 }
  131.                 v[st]=currlen;        
  132.                 //delete first character
  133.                 w1[cc[st]-'a']--;
  134.                 if(w1[cc[st]-'a']<0)
  135.                         w1[cc[st]-'a']+=mod1;
  136.                 --currlen;
  137.                 if(currlen>1)
  138.                 {
  139.                         w1[cc[st+currlen]-'a']-=factors1[currlen];
  140.                         if(w1[cc[st+currlen]-'a']<0)
  141.                                 w1[cc[st+currlen]-'a']+=mod1;
  142.                         --currlen;
  143.                 }
  144.                 currhash=0;
  145.                 REP(i,26)
  146.                 {
  147.                         w1[i]*=inversefactor1;
  148.                         w1[i]%=mod1;
  149.                         currhash+=w1[i]*perm[i][st+1];
  150.                         currhash%=mod1;
  151.                 }
  152.                 if(currlen>1 && !hash.count(make_pair(currlen,currhash)))
  153.                 {
  154.                         hash[make_pair(currlen,currhash)]=actsimilar+1;
  155.                 }          
  156.         }
  157.         vector<LL> vz(N),vv(N);
  158.         REP(i,N)
  159.         {
  160.                 if(i+v[i]<=N)
  161.                         vz[i+v[i]-1]++;
  162.         }
  163.         vv[0]=vz[0];
  164.         FOR(i,1,N)
  165.         {
  166.             vz[i]+=vz[i-1];
  167.             vv[i]=vv[i-1]+vz[i];    
  168.         }
  169.         REP(i,N)
  170.             printf("%lld\n",vv[i]);
  171.         return 0;
  172. }
Add Comment
Please, Sign In to add comment