이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define pb push_back
#define ll long long
#define forn(i,n) for(int i=0; i<(int)n; i++)
#define forn1(i,n) for(int i=1; i<=(int)n; i++)
#define sfd(a) scanf("%d", &a)
#define sffd(a,b) scanf("%d%d", &a, &b)
#define sffl(a,b) scanf("%lld%lld", &a,&b)
#define sfl(a) scanf("%lld", &a)
#define pii pair<int , int>
#define pll pair<ll , ll>
#define ff first
#define ss second
#define mem(a, val) memset(a, val, sizeof(a))
#define all(x) (x).begin(), (x).end()
//#define mx 200005
#define INF_mx 1e18
#define gcd(a,b) __gcd(a, b)
#define lcm(a,b) (a*b)/__gcd(a,b)
#define PRINT cout<<"hi"<<endl
#define PI acos(-1)
#define fast_in_out ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define Q int q; cin>>q; while(q--)
/*
const ll sz=1000001;
const ll N=1e12;
vector<ll>prime;
bool flag[sz+3];
void sieve(void)
{
ll i,j,add;
flag[0]=flag[1]=1;
prime.push_back(2);
for(i=4; i<sz; i+=2)
flag[i]=1;
for(i=3; i<sz; i+=2)
{
if(!flag[i])
{
prime.push_back(i);
if(sz/i>=i)
{
add=i*2;
for(j=i*i; j<sz; j+=add)
flag[j]=1;
}
}
}
}
*/
/*
const int MOD = 1000000007 ;
long long int bigmod ( long long B, int P, int M )
{
if ( P == 0 )return 1;
if ( P % 2 ) {
return ( ( B % M ) * ( bigmod ( B, P-1, M))) % M;
}
else {
long long mod = bigmod (B,P/2,M);
return ((mod%M)*(mod%M))%M;
}
}
*/
/*
tree<
int,
null_type,
less_equal<int>,
rb_tree_tag,
tree_order_statistics_node_update>t;
*/
const ll N = 3e5 + 10 ;
ll Tree[N][26], idx;
ll len[N], link[N], t;
string s;
ll occ[N];
void pre_set(){
len[1] = -1, link[1] = 1;
len[2] = 0, link[2] = 1;
idx = t = 2 ;
mem(occ, 0);
}
void extend(int p)
{
while(s[p - len[t] - 1 ] != s[p]) t = link[t];
int x = link[t];
while(s[p - len[x] -1] != s[p] ) x = link[x];
int c = s[p] - 'a';
if(!Tree[t][c]){
Tree[t][c] = ++idx;
len[idx] = len[t]+2;
link[idx] = len[idx] == 1 ? 2 : Tree[x][c];
}
t = Tree[t][c];
occ[t]++;
}
int main()
{
fast_in_out
cin>>s;
pre_set();
for(int i=0; i<s.size(); i++){
extend(i);
}
for(int i=idx; i>2 ;i--){
occ[link[i]]+=occ[i];
}
ll mx=0;
for(int i=idx; i>2; i--){
if(occ[i]*len[i] > mx ) mx = occ[i] * len[i];
}
cout << mx << endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
palindrome.cpp: In function 'int main()':
palindrome.cpp:134:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
134 | for(int i=0; i<s.size(); i++){
| ~^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |