제출 #469904

#제출 시각아이디문제언어결과실행 시간메모리
469904naman1601Necklace (Subtask 4) (BOI19_necklace4)C++17
0 / 15
180 ms65540 KiB
/*
++[---------->+<]>.-[------>+<]>-.++++++++.+++++.-[->+++++<]>-.-[--->++<]>--.+.[--->+<]>---.[->+++<]>++.++++++.-------.++++++.--[--->+<]>.-[->+++<]>-..+++++++++++++.[----->++<]>.------------.+[----->+<]>.--------.+++++++++++++.-------------.--[--->+<]>-.---[->++++<]>-.++++[->+++<]>.--[--->+<]>-.[->+++<]>++.-.+++.---.-[->+++<]>.-[--->++<]>+.++++.------.[--->+<]>---.+[----->+<]>.------------.+++++++.-------.--[--->+<]>---.+++[->+++<]>++..+++++++++.---------.-[->+++<]>.+[----->+<]>+.-------------.+++++++.+.----[->+++<]>-.
*/
#include <bits/stdc++.h>
using namespace std;

typedef long long big;
typedef long double ludo;
#define pbb pair<big, big>
#define pii pair<int, int>
#define fe first
#define se second
#define maxheap priority_queue
#define mset multiset
#define uset unordered_set
#define umap unordered_map
#define fr(i, s, e) for(int i = s; i < e; i++)
#define revfr(i, s, e) for(int i = s - 1; i >= e; i--)
#define getv(v, n) for(int i = 0; i < n; i++) cin >> v[i];
#define speed ios_base::sync_with_stdio(false); cin.tie(NULL)
#define nl "\n"
// #define debug(text) if(do_debug) {cout << (#text) << ": " << text << endl;}
#ifdef naman1601
#define debug(text) cout << (#text) << ": " << text << endl;
#else
#define debug(text)
#endif

const big mod = 1000000007;
// const big mod = 998244353;
const big infinity = 1000000000000000000;
const int inf = 1e9 + 5;
bool do_debug = false;


void kmp(vector<int>& v, string s, int len) {

	fr(i, 1, len) {

		int j = v[i - 1];

		while(j > 0 && s[i] != s[j]) {

			j = v[j - 1];
		}

		if(s[i] == s[j]) {

			j++;
		}
		
		v[i] = j;
	}
}


const int maxn = 3005;
string s, t;
int sl, tl;
int stdp[maxn][maxn] = {0};
int tsdp[maxn][maxn] = {0};


int ans = 0;
pii ap = make_pair(-1, -1);


int inv(int idx) {

	return (sl - idx) - 1;
}


void pc() {

	fr(i, 0, sl) {

		string aux = s.substr(i, sl - i) + "#" + t;
		int al = aux.length();
		vector<int> pf(al, 0);
		kmp(pf, aux, al);

		fr(j, 0, tl) {

			stdp[i][j] = pf[al - tl + j];
		}
	}

	fr(i, 0, tl) {

		string aux = t.substr(i, tl - i) + "#" + s;
		int al = aux.length();
		vector<int> pf(al, 0);
		kmp(pf, aux, al);

		fr(j, 0, sl) {

			tsdp[i][j] = pf[al - sl + j];
		}
	}
}


void f() {

	fr(i, 0, 1) {

		fr(j, 0, tl) {

			int temp = stdp[i][j];

			if(temp > ans) {

				ans = temp;
				ap = make_pair(0, j - stdp[i][j] + 1);
				// cout << ap.fe << " " << ap.se << " " << temp << nl;
			}
		}
	}

	fr(i, 1, sl) {

		fr(j, 0, tl) {

			int temp = stdp[i][j] + tsdp[j + 1][i - 1];

			if(temp > ans) {

				ans = temp;
				ap = make_pair((i - 1) - tsdp[j + 1][i - 1] + 1, j - stdp[i][j] + 1);
				// cout << ap.fe << " " << ap.se << " " << temp << nl;
			}
		}
	}
}


void g() {

	fr(i, 0, 1) {

		fr(j, 0, tl) {

			int temp = stdp[i][j];

			if(temp > ans) {

				ans = temp;
				ap = make_pair(inv(stdp[i][j] - 1), j - stdp[i][j] + 1);
				// cout << ap.fe << " " << ap.se << " " << temp << nl;
			}
		}
	}

	fr(i, 1, sl) {

		fr(j, 0, tl) {

			int temp = stdp[i][j] + tsdp[j + 1][i - 1];

			if(temp > ans) {

				ans = temp;
				ap = make_pair(inv(i + stdp[i][j] - 1), j - stdp[i][j] + 1);
				// cout << ap.fe << " " << ap.se << " " << temp << nl;
			}
		}
	}
}


void solve() {

	cin >> s >> t;
	sl = s.length();
	tl = t.length();

	pc();

	// fr(i, 0, sl) {

	// 	fr(j, 0, tl) {

	// 		cout << i << ", " << j << ": " << stdp[i][j] << nl;
	// 	}
	// }

	f();
	reverse(s.begin(), s.end());
	pc();
	g();

	// fr(i, 0, sl) {

	// 	fr(j, 0, tl) {

	// 		cout << i << ", " << j << ": " << stdp[i][j] << nl;
	// 	}
	// }

	cout << ans << nl << ap.fe << " " << ap.se << nl;
}


int main() {
	
	speed;

	int q = 1;
	// cin >> q;

	while(q-- > 0) {

		solve();
	}

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