社区讨论
daolao求调
P1210[USACO1.3] 最长的回文 Calf Flac参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjlh34i
- 此快照首次捕获于
- 2025/11/04 04:30 4 个月前
- 此快照最后确认于
- 2025/11/04 04:30 4 个月前
CPP
#include <bits/stdc++.h>
#define MAXN 2000005
using namespace std;
string s;
char str[MAXN];
int m[MAXN],w[MAXN];
int ln,rn,maxn = -1;
bool check(char x){
if ((x>='a'&&x<='z')||(x>='A'&&x<='Z')) return 0;
return 1;
}
void manachar(){
int id,i;
for (i=0,id=0;id<=s.length();i++){
if (i%2==0){
str[i] = '#';
}
else{
while (check(s[id])) id++;
if (id<=s.length()){
w[i] = id;
str[i] = tolower(s[id++]);
}
}
}
int len = i;
int d = -1,c = -1;
for (int i=0;i<len;i++){
int l,r;
if (d>i){
if (2*c-i>-1) m[i] = min(m[2*c-i],d-i);
else m[i] = d-i;
}
else m[i] = 1;
while (i+m[i]<len&&i-m[i]>-1){
if (str[i+m[i]]==str[i-m[i]]){
if (str[i-m[i]]!='#' && w[i-m[i]]!=0){
l = i-m[i];
}
if (str[i+m[i]]!='#' && w[i+m[i]]!=0){
r = i+m[i];
}
m[i]++;
}
else break;
}
if (i+m[i]>d){
d = i+m[i];
c = i;
}
if (m[i]>maxn){
maxn = m[i];
ln = l;
rn = r;
}
}
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
getline(cin,s);
manachar();
cout << maxn-1 << endl;
for (int i=w[ln];i<=w[rn];i++) cout << s[i];
return 0;
}
样例可过,12分
回复
共 0 条回复,欢迎继续交流。
正在加载回复...