Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int solve()
- {
- char s[10002], t[1000002];
- scanf(" %s", s);
- scanf(" %s", t);
- int n = strlen(s);
- int m = strlen(t);
- if (n > m)
- puts("0"), exit(0);
- short int ZZ[n + m + 1];
- fill(ZZ, ZZ + n + m + 1, 10000);
- ZZ[n] = -1488;
- int plst[26];//map<char, int> plst;
- fill(plst, plst + 26, -1);
- //calc pHash
- for (int i = 0; i < n; ++i)
- {
- if (s[i] >= 'A' && s[i] <= 'Z')
- {
- ZZ[i] = 10001 + (s[i] - 'A');
- }
- else
- {
- if (plst[s[i] - 'a'] != -1)
- {
- ZZ[plst[s[i] - 'a']] = i - plst[s[i] - 'a'];
- }
- plst[s[i] - 'a'] = i;
- }
- }
- //calc tHash
- int tlst[26];//map<char, int> tlst;
- fill(tlst, tlst + 26, -1);
- vector<short int> upd[n + m + 1];
- for (int i = 0; i < m; ++i)
- {
- if (t[i] >= 'A' && t[i] <= 'Z')
- {
- ZZ[i + n + 1] = 10001 + (t[i] - 'A');
- }
- else
- {
- if (tlst[t[i] - 'a'] != -1)
- {
- if (i - tlst[t[i] - 'a'] < n)
- {
- int l = tlst[t[i] - 'a'];
- if (i - n <= 0)
- {
- ZZ[l + n + 1] = i - l;
- }
- else
- {
- upd[i + 2].inb(i - l);
- }
- }
- }
- tlst[t[i] - 'a'] = i;
- }
- }
- delete s;
- delete t;
- vector<short int> z(n + m + 1);
- {
- int l = 0, r = 0;
- int sz = n + m + 1;
- for (int i = 1; i < sz; ++i)
- {
- for (auto &ev : upd[i])
- {
- //pos = i + 2
- //.X = l + n + 1
- //.Y = i - l
- //l = i - 2 - ev
- ZZ[i - 2 - ev + n + 1] = ev;
- }
- if (i <= r)
- z[i] = min((short int)(r - i + 1), z[i - l]);
- while (i + z[i] < sz && ZZ[z[i]] == ZZ[i + z[i]])
- ++z[i];
- if (i + z[i] - 1 > r)
- l = i, r = i + z[i] - 1;
- }
- }
- vector<int> ans;
- for (int i = 1; i + n - 1 <= m; ++i)
- {
- if (z[i + n] == n)
- ans.inb(i);
- }
- printf("%d\n", (int)ans.size());
- for (int x : ans)
- printf("%d ", x);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement