Submission #1133539

#TimeUsernameProblemLanguageResultExecution timeMemory
113353979brueJoyful KMP (KRIII5_JK)C++20
0 / 1
12 ms24132 KiB
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

using namespace std;
typedef long long ll;

int n;
string str;

int fail[1010101];

int cnt;
int grp[1010101];

vector<int> adj[1010101];

void kmp() {
	int i = 1;
	int j = 0;

	cnt = 1;

	vector<int> v;

	while (i < n) {
		if (str[i] == str[j]) {
			grp[i] = grp[j];

			for (int dif : v) {
				adj[grp[i]].push_back(dif);
			}

			v.clear();

			fail[i] = j + 1;
			i++, j++;
		}
		else {
			v.push_back(grp[j]);

			if (j == 0) {
				grp[i] = cnt++;

				for (int dif : v) {
					adj[grp[i]].push_back(dif);
					adj[dif].push_back(grp[i]);
				}

				v.clear();

				i++;
			}
			else {
				j = fail[j - 1];
			}
		}
	}
}

int now = 0;

bool deleted[1010101];
int delcnt = 0;

ll solve() {
	for (int i = now; i < cnt; i++) {
		if (adj[i].empty() || deleted[i]) continue;

		now = i;

		ll ans = 0;

		int j = adj[i].back();

		adj[i].pop_back();
		if (adj[j].back() != i) remove(adj[j].begin(), adj[j].end(), i);
		else adj[j].pop_back();

		ans += solve();

		for (int k : adj[j]) {
			if (find(adj[i].begin(), adj[i].end(), k) == adj[i].end()) adj[i].push_back(k);
			if (find(adj[k].begin(), adj[k].end(), i) == adj[k].end()) adj[k].push_back(i);

			remove(adj[k].begin(), adj[k].end(), j);
		}

		adj[j].clear();

		deleted[j] = true;
		delcnt++;

		ans -= solve();

		return ans;
	}

	ll ans = 1;

	for (int i = 0; i < cnt - delcnt; i++) {
		ans *= 26;
		ans %= 1000000007;
	}

	return ans;
}

ll order = 0;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> str;
	n = (int)str.size();

	cin >> order;

	kmp();

	for (int i = 0; i < cnt; i++) {
		sort(adj[i].begin(), adj[i].end());
		adj[i].erase(unique(adj[i].begin(), adj[i].end()), adj[i].end());
	}

	cout << solve() << "\n";

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...