A:花非花
题目:
用Manacher,关于这个最长回文串所有解法可以参考这个连接:力扣https://leetcode.cn/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode-solution/
以前看过没练过所以用不来(寄
马拉车处理臂长数组以后,本题要求的是回文串个数,即对于每个i和它对应的p[i],都有 i-p[i]+1~i 部分为开头的回文串数量+1。这一步我暴力尝试了一次但是TLE。题解中提了一嘴差分处理区间加,嗯确实只能这样。
关于差分区间加减,可以参考这个连接:(本处用到的是最下面 3.用途 的第一个小点)
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int a[N],b[N],p[N],cnt,n;
int c[N];
void init(){
//创建马拉车数组
b[cnt]=-1;
for(int i=1;i<=n;i++){
b[++cnt]=a[i];
b[++cnt]=-2;
}
b[++cnt]=-3;
}
void manacher(){
int mx=0,id=0;
for(int i=1;i<=cnt;i++){
//取值
if(i<mx)p[i]=min(mx-i,p[2*id-i]);
else p[i]=1;
//中心扩展
while(b[i-p[i]]==b[i+p[i]])p[i]++;
if(i+p[i]>mx){
mx=i+p[i];
id=i;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
//用马拉车对数组进行预处理得到臂长数组p[];
init();
manacher();
//这种找最终答案的方法要超时!!注意循环嵌套了
// for(int i=1;i<=cnt;i++){
// //找到i的臂长以后对i-pi+1~i的部分回文串数目++;
// int x=i+1-p[i];
// for(int j=x;j<=i;j++)c[j]++;
// }
// for(int i=1;i<=cnt;i++){
// if(b[i]>0)cout<<c[i]<<" ";
// }
// cout<<endl;
for(int i=1;i<=cnt;i++){
//差分处理区间加
int x=i+1-p[i];
c[x]++;
c[i+1]--;
}
int res=0;
for(int i=1;i<=cnt;i++){
res+=c[i];
//b[i]<0的部分为马拉车占位符
if(b[i]>0) cout<<res<<" ";
}
}
J:满城烟水月微茫,人倚兰舟唱
简单队列模拟,没时间...
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,m,num[maxn],x;//num表示每堆有几张
queue<int> q[maxn];
int ans;
int simulate(int yu){
while(yu>0){
int ming=-1,hua=-1;
int ming_i=-1;
//抽牌
for(int i=0;i<n;i++){
if(!q[i].empty()){
if(hua==-1){
hua=q[i].front();
q[i].pop();
}
}
if(!q[i].empty()){
if(ming==-1){
ming_i=i;
ming=q[i].front();
q[i].pop();
}
}
if(ming!=-1&&hua!=-1)break;
}
//小明开始使坏
while(ming<=hua&&ming_i<n){
if(ming_i<n-1)q[ming_i+1].push(ming);
else yu--;
if(!q[ming_i].empty()){
ming=q[ming_i].front();
q[ming_i].pop();
}
else if(ming_i+1<n){
ming_i++;
ming=q[ming_i].front();
q[ming_i].pop();
}
else break;
}
if(ming>hua)ans++;
yu-=2;
}
return ans;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>num[i];
for(int j=0;j<num[i];j++){
cin>>x;
q[i].push(x);
}
}
cout<<simulate(m)<<endl;
}