put(2333...333)
a[i]=b[i]=MAX; MAX=max(MAX,a[i]);
#include<bits/stdc++.h>
using namespace std;
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define pr printf
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
typedef long long ll;
typedef unsigned long long ull;
const int N=1e6+6;
const int mod=998244353;
template<typename T>int O(T s){cout<<s<<endl;return 0;}
template<typename T>void db(T *bg,T *ed){while(bg!=ed)cout<<*bg++<<' ';pr("\n");}
template<typename T>void db(vector<T>it){for(auto i:it)cout<<i<<' ';pr("\n");}
inline ll mul_64(ll x,ll y,ll c){return (x*y-(ll)((long double)x/c*y)*c+c)%c;}
inline ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c;return ans;}
inline void exgcd(ll a,ll b,ll &x,ll &y){if(!b)x=1,y=0;else exgcd(b,a%b,y,x),y-=(a/b)*x;}
int n,k;
int p[N];
int pos[N]={0};
int main(){
// IN
cin>>n>>k;
for(int i=0;i++<n;sc("%d",&p[i]));
ll ans=0,res=1;
for(int i=n;k;i--,k--)ans+=i,pos[i]=1;
int last=0;
for(int i=1;i<=n;i++){
if(pos[p[i]]){
if(!last){
last=i;continue;
}
res=res*(i-last)%mod;
last=i;
}
}
cout<<ans<<" "<<res<<endl;
}D1,D2. Prefix-Suffix Palindrome (Hard version)
找到前缀和后缀最长的,将中间的字符串拿出来找最长回文前缀,后缀,可以用KMP算法,hash,manacher或者回文树。
#include<bits/stdc++.h>
using namespace std;
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define pr printf
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
typedef long long ll;
typedef unsigned long long ull;
const int N=2e6+6;
const int mod=1e9+7;
template<typename T>int O(T s){cout<<s<<endl;return 0;}
template<typename T>void db(T *bg,T *ed){while(bg!=ed)cout<<*bg++<<' ';pr("\n");}
template<typename T>void db(vector<T>it){for(auto i:it)cout<<i<<' ';pr("\n");}
inline ll mul_64(ll x,ll y,ll c){return (x*y-(ll)((long double)x/c*y)*c+c)%c;}
inline ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c;return ans;}
inline void exgcd(ll a,ll b,ll &x,ll &y){if(!b)x=1,y=0;else exgcd(b,a%b,y,x),y-=(a/b)*x;}
int L[N]={-1};
int kmp(const string& s){
int i=0,j=-1,n=s.size();L[0]=-1;
while(i<n)if(j==-1||s[i]==s[j])L[++i]=++j;else j=L[j];
return L[n];
}
int main(){
// IN
int t;cin>>t;
while(t--){
string s;cin>>s;
int l=0,r=(int)s.size()-1;
if(r==0){
O(s);continue;
}
while(l<r&&s[l]==s[r])l++,r--;
string s1="",s2="";
if(l)s1=s.substr(0,l),s2=s.substr(r+1);
s=s.substr(l,r-l+1);string t=s;reverse(t.begin(),t.end());
string a=s+"1"+t,b=t+"1"+s;
string x=s.substr(0,kmp(a));
string y=t.substr(0,kmp(b));
if(x.size()<y.size())swap(x,y);
cout<<s1<<x<<s2<<endl;
}
}#include<bits/stdc++.h>
using namespace std;
#define me(a,x) memset(a,x,sizeof(a))
#define sc scanf
#define pr printf
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
typedef long long ll;
typedef unsigned long long ull;
const int N=3e5+6;
const int mod=1e9+7;
template<typename T>int O(T s){cout<<s<<endl;return 0;}
template<typename T>void db(T *bg,T *ed){while(bg!=ed)cout<<*bg++<<' ';pr("\n");}
template<typename T>void db(vector<T>it){for(auto i:it)cout<<i<<' ';pr("\n");}
inline ll mul_64(ll x,ll y,ll c){return (x*y-(ll)((long double)x/c*y)*c+c)%c;}
inline ll ksm(ll a,ll b,ll c){ll ans=1;for(;b;b>>=1,a=a*a%c)if(b&1)ans=ans*a%c;return ans;}
inline void exgcd(ll a,ll b,ll &x,ll &y){if(!b)x=1,y=0;else exgcd(b,a%b,y,x),y-=(a/b)*x;}
int n;
int p[N],q[N];
int pos[N];
struct sigment{
int MAX[N*4+1],add[N*4+1];
void push(int rt){
if(add[rt]){
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
MAX[rt<<1]+=add[rt];
MAX[rt<<1|1]+=add[rt];
}
add[rt]=0;
}
void up(int l,int r,int val,int rt=1,int L=1,int R=n){
if(L>=l&&R<=r){
add[rt]+=val;
MAX[rt]+=val;
return;
}
push(rt);
int mid=L+R>>1;
if(mid>=l)up(l,r,val,rt<<1,L,mid);
if(mid<r)up(l,r,val,rt<<1|1,mid+1,R);
MAX[rt]=max(MAX[rt<<1],MAX[rt<<1|1]);
}
}T;
int main(){
cin>>n;
for(int i=0;i++<n;sc("%d",&p[i]),pos[p[i]]=i);
for(int i=0;i++<n;sc("%d",&q[i]));
int ans=n;T.up(1,pos[n],1);
for(int i=1;i<=n;i++){
pr("%d ",ans);
if(i==n)return O("");
T.up(1,q[i],-1);
while(T.MAX[1]<=0)T.up(1,pos[--ans],1);
}
}
京公网安备 11010502036488号