Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define MAX 2007
- using namespace std;
- typedef long long int ll;
- typedef pair<ll, ll> pll;
- string txt, rev;
- int arr[MAX];
- struct hash_{
- ll _hash[2][MAX], mult[2][MAX];
- ll b1, b2 , m1, m2;
- hash_(ll b1 = 311,ll m1 = 1000000021,ll b2 = 317,ll m2 = 1000000009):
- b1(b1), m1(m1), b2(b2), m2(m2){calc();}
- void calc(){
- mult[0][0] = mult[1][0] = 1;
- for(ll i = 1; i < MAX; i++){
- mult[0][i] = (mult[0][i-1]*b1)%m1;
- mult[1][i] = (mult[1][i-1]*b2)%m2;
- }
- }
- void compute(string &txt){
- _hash[1][0] = _hash[0][0] = txt[0] + 1;
- for(int i = 1; i < txt.size(); i++){
- _hash[0][i] = ((_hash[0][i-1]*b1)%m1 + txt[i]+1)%m1;
- _hash[1][i] = ((_hash[1][i-1]*b2)%m2 + txt[i]+1)%m2;
- }
- }
- pll substr(ll l, ll r){
- if(!l) return make_pair(_hash[0][r], _hash[1][r]);
- ll x = (_hash[0][r]-(_hash[0][l-1]*mult[0][r-l+1])%m1 + m1)%m1;
- ll y = (_hash[1][r]-(_hash[1][l-1]*mult[1][r-l+1])%m2 + m2)%m2;
- return make_pair(x, y);
- }
- } palavra, reversa;
- void reverte(){
- rev = "";
- for(int i = txt.size()-1; i >= 0; i--){
- rev += txt[i];
- }
- }
- bool check(ll l, ll r){
- pll x = palavra.substr(l, r);
- pll y = reversa.substr(txt.size()-r-1, txt.size()-l-1);
- return x.first == y.first && y.second == x.second;
- }
- int main(){
- cin >> txt;
- reverte();
- palavra.compute(txt); reversa.compute(rev);
- int num; cin >> num;
- for(int i = 0; i < num; i++) {
- int aux; cin >> aux;
- arr[aux]++;
- }
- int ans = 0, maior = 0;
- for(ll l = 0; l < txt.size(); l++){
- int aux = 0;
- for(ll r = l; r < txt.size(); r++){
- aux += arr[r];
- if(check(l, r) && maior <= aux){
- if(maior == aux) {
- if(ans < r-l+1) ans = r-l+1;
- }else{
- maior = aux;
- ans = r-l+1;
- }
- }
- }
- }
- cout << ans << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement