Advertisement
K_Y_M_bl_C

Untitled

Sep 13th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. int solve()
  2. {
  3.     char s[10002], t[1000002];
  4.     scanf(" %s", s);
  5.     scanf(" %s", t);
  6.     int n = strlen(s);
  7.     int m = strlen(t);
  8.     if (n > m)
  9.         puts("0"), exit(0);
  10.     short int ZZ[n + m + 1];
  11.     fill(ZZ, ZZ + n + m + 1, 10000);
  12.     ZZ[n] = -1488;
  13.     int plst[26];//map<char, int> plst;
  14.     fill(plst, plst + 26, -1);
  15.     //calc pHash
  16.     for (int i = 0; i < n; ++i)
  17.     {
  18.         if (s[i] >= 'A' && s[i] <= 'Z')
  19.         {
  20.             ZZ[i] = 10001 + (s[i] - 'A');
  21.         }
  22.         else
  23.         {
  24.             if (plst[s[i] - 'a'] != -1)
  25.             {
  26.                 ZZ[plst[s[i] - 'a']] = i - plst[s[i] - 'a'];
  27.             }
  28.             plst[s[i] - 'a'] = i;
  29.         }
  30.     }
  31.     //calc tHash
  32.     int tlst[26];//map<char, int> tlst;
  33.     fill(tlst, tlst + 26, -1);
  34.     vector<short int> upd[n + m + 1];
  35.     for (int i = 0; i < m; ++i)
  36.     {
  37.         if (t[i] >= 'A' && t[i] <= 'Z')
  38.         {
  39.             ZZ[i + n + 1] = 10001 + (t[i] - 'A');
  40.         }
  41.         else
  42.         {
  43.             if (tlst[t[i] - 'a'] != -1)
  44.             {
  45.                 if (i - tlst[t[i] - 'a'] < n)
  46.                 {
  47.                     int l = tlst[t[i] - 'a'];
  48.                     if (i - n <= 0)
  49.                     {
  50.                         ZZ[l + n + 1] = i - l;
  51.                     }
  52.                     else
  53.                     {
  54.                         upd[i + 2].inb(i - l);
  55.                     }
  56.                 }
  57.             }
  58.             tlst[t[i] - 'a'] = i;
  59.         }
  60.     }
  61.     delete s;
  62.     delete t;
  63.     vector<short int> z(n + m + 1);
  64.     {
  65.         int l = 0, r = 0;
  66.         int sz = n + m + 1;
  67.         for (int i = 1; i < sz; ++i)
  68.         {
  69.             for (auto &ev : upd[i])
  70.             {
  71.                 //pos = i + 2
  72.                 //.X = l + n + 1
  73.                 //.Y = i - l
  74.                 //l = i - 2 - ev
  75.                 ZZ[i - 2 - ev + n + 1] = ev;
  76.             }
  77.             if (i <= r)
  78.                 z[i] = min((short int)(r - i + 1), z[i - l]);
  79.             while (i + z[i] < sz && ZZ[z[i]] == ZZ[i + z[i]])
  80.                 ++z[i];
  81.             if (i + z[i] - 1 > r)
  82.                 l = i, r = i + z[i] - 1;
  83.         }
  84.     }
  85.     vector<int> ans;
  86.     for (int i = 1; i + n - 1 <= m; ++i)
  87.     {
  88.         if (z[i + n] == n)
  89.             ans.inb(i);
  90.     }
  91.     printf("%d\n", (int)ans.size());
  92.     for (int x : ans)
  93.         printf("%d ", x);
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement