Submission #1312881

#TimeUsernameProblemLanguageResultExecution timeMemory
1312881mikasaPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
2440 ms106084 KiB
#include<bits/stdc++.h>
using namespace std;
#define debug(n,m) cout<<"["<<#n<<"]->"<<n<<m
#define int long long
#define all(x) x.begin(),x.end()

#define io(nam) if (!(nam).empty()) { \
    freopen(((nam)+".in").c_str(),"r",stdin); \
    freopen(((nam)+".out").c_str(),"w",stdout); \
}
  #define pb push_back 
const int N=2e6+5;
const int mod=1e9+9;
const int inf=9e18;

int a[N];

string s;

struct Segtree {


  struct Node {
    int ha;
    int len;
  };

  int p=149;
  vector<int> ppow;
  

  Node merge(Node a , Node b) {
    return {(b.ha+(ppow[b.len]*a.ha%mod))%mod,a.len+b.len};
  }

  vector<Node> tr;
  vector<int> lz;

  void init(int n) {
    tr.assign(4*n,{0,0});
    lz.assign(4*n,0);
    ppow.resize(n+1);
    ppow[0]=1;
    for (int i=1;i<=n;++i) {
      ppow[i]=ppow[i-1]*p%mod;
    }
  }

  void build(int u,int l,int r) {
    if (l==r) {
      tr[u]={s[l],1};
      return;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    tr[u]=merge(tr[u<<1],tr[u<<1|1]);
  }

  // void push(int u,int l,int r) {
  //   if (!lz[u]) return;
  //   int k=lz[u];
  //   if (l!=r) {
  //     lz[u<<1]=lz[u<<1|1]=lz[u];
  //     int mid=l+r>>1;
  //     int le=mid-l+1,ri=r-mid;
  //     tr[u<<1]={k*su[le]%mod,le};
  //     tr[u<<1|1]={k*su[ri]%mod,ri};
  //   }
  //   lz[u]=0;
  // }s

  // void upd(int u,int l,int r,int x,int y,int k) {
  //   if (l>y||r<x) return;
  //   if (l>=x&&r<=y) {
  //     lz[u]=k;
  //     tr[u]={k*su[r-l+1]%mod,r-l+1};
  //     return;
  //   }
  //   push(u,l,r);
  //   int mid=l+r>>1;
  //   upd(u<<1,l,mid,x,y,k);
  //   upd(u<<1|1,mid+1,r,x,y,k);
  //   tr[u]=merge(tr[u<<1],tr[u<<1|1]);
  // }
  Node query(int u,int l,int r,int x,int y) {
    if (l>y||r<x) return {0,0} ;
    if (l>=x&&r<=y) {
      return tr[u];
    }
    //push(u,l,r);
    int mid=l+r>>1;
    Node le=query(u<<1,l,mid,x,y);
    Node ri=query(u<<1|1,mid+1,r,x,y);
    return merge(le,ri);
  }
};


void levi() {
  cin>>s;
  int n=s.size();
  s='!'+s;
int len=1,res=0;
  Segtree h;
  h.init(n);
  h.build(1,1,n);
  for (int i=1;i<=n/2;) {
    while (h.query(1,1,n,i,i+len-1).ha!=h.query(1,1,n,n-i+1-len+1,n-i+1).ha) {
      ++len;
      if (i+len-1>n/2) break;
    }
    int j=i+len-1;
    // debug(i,' ');
    // debug(j,'\n');
    if (j>n/2) {
      cout<<++res<<'\n';
      return;
    }
    res+=2;
    i+=len;
    len=1;
  }
  if (n&1) ++res;
  cout<<res<<'\n';
}

int32_t main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);int tt=1;cin>>tt;
  while (tt--) levi();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...