ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022湖北省赛 J. Palindrome Reversion (字符串哈希)

2022-06-01 20:02:53  阅读:127  来源: 互联网

标签:Palindrome const ull Reversion long int len 2022 define


https://codeforces.com/gym/103729/problem/J
题意: 选择一个子串翻转一次,问是否能得到一个回文串
image

#include<bits/stdc++.h>
//#include <bits/extc++.h>
using namespace std;
// using namespace __gnu_cxx;
// using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(false) ,cin.tie(0), cout.tie(0);  
//#pragma GCC optimize(3,"Ofast","inline")
#define ll long long
#define ull unsigned long long
#define li __int128_t
//#define int long long
const int N = 1e5 + 5;
const int M = 1e6 + 5;
const int mod = 998244353;
const ll LNF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);

struct str_hash { //严格鸽板子
   ull base = 131;
   ull p[N]; char s[N];
   unordered_map<ull, ull> mp;
   // 上面可以换成数组:ull mp[N];
   int n;
   void init( string &str ) {
       n = str.length();
       mp.clear();
       for ( int i = 1; i <= n; ++ i ) s[i] = str[i - 1];
       p[0] = 1;
       for ( int i = 1; i <= n; ++ i ) {
           mp[i] = mp[i - 1] * base + s[i];
           p[i] = p[i - 1] * base;
       }
   }
   ull hash( ull l , ull r ) {
       return mp[r] - mp[l - 1] * p[r - l + 1];
   }
}nor, rev;

int main() {
  string s; cin >> s;
  string ss; int len = s.length();
  int st = 0;
  for ( int i = 0; i < len; ++ i ) {
    if(s[i] == s[len - i - 1]) {
      ++ st;
    } else break;
  }
  for ( int i = st; i < len - st; ++ i ) {
    ss += s[i];
  }
  if(ss.size() == 0 ) {
    cout << 1 << " " << 1 << endl; return 0;
  }
  nor.init(ss); reverse(ss.begin(), ss.end());  rev.init(ss);
  int n = ss.length();
  //AAP
  for ( int l = 1; l <= n / 2; ++ l ) {
    if(nor.hash(1, l) == nor.hash( 1 + l, l * 2 ) ) {
      int pst = 2*l + 1;
      if(pst == n + 1) {
        cout << 1 + st << " " << l + st << endl; return 0;
      }
      if( nor.hash( pst, n ) == rev.hash( 1, n - pst + 1) ) {
        cout << l + 1 + st << " " << n + st << endl; return 0;
      }
    }
  }
  //PAA
  for ( int l = 1; l <= n / 2; ++ l ) {
    if(rev.hash(1, l) == rev.hash( 1 + l, l * 2 ) ) {
      int pst = 2*l + 1;
      if(pst == n + 1) {
        cout << 1 + st << " " << l + st << endl; return 0;
      }
      if( rev.hash( pst, n ) == nor.hash( 1, n - pst + 1 ) ) {
        cout << 1 + st << " " << n - l + st << endl; return 0;
      }
    }
  }
  //APA
  for ( int l = 1; l <= n / 2; ++ l ) {
    if(nor.hash(1, l) == nor.hash( n - l + 1, n ) ) {
      int pst = l + 1;

      if( nor.hash( pst, n - l ) == rev.hash( pst, n - l ) ) {
        cout << 1 + st << " " << l + st << endl; return 0;
      }
    }
  }
  cout << -1 << " " << -1 << endl;
  return 0;
}

标签:Palindrome,const,ull,Reversion,long,int,len,2022,define
来源: https://www.cnblogs.com/muscletear/p/16335466.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有