2019 Xuzhou Online Contest Problem G Colorful String
1654 단어 데이터 구조
#include
using namespace std;
typedef long long ll;
const int N=3e5+10;
int NUM[N][30];
int check(int l,int r){
int ans=0;
for(int i=1;i<=26;++i)if(NUM[r][i]>NUM[l-1][i])++ans;
return ans;
}
int ans[N];
struct Palindromic_Automaton {
int ch[N][26], f[N], len[N], s[N], ok[N];
int cnt[N]; // ( count() )
int num[N]; //
int last, sz, n;
int newnode(int x) {
memset(ch[sz], 0, sizeof(ch[sz]));
cnt[sz] = num[sz] = 0, len[sz] = x;
return sz++;
}
void init() {
sz = 0; newnode(0), newnode(-1); last = n = 0, s[0] = -1, f[0] = 1;
}
int get(int u) {for (; s[n - len[u] - 1] != s[n]; u = f[u]); return u;}
void add(int c) {
s[++n] = c;
int u = get(last);
if (!ch[u][c]) {
int np = newnode(len[u] + 2);
f[np] = ch[get(f[u])][c];
num[np] = num[f[np]] + 1;
ch[u][c] = np;
ok[np]=check(n-len[np]+1,n);
}
last = ch[u][c];
cnt[last]++;
}
ll count(){
ll ans=0;
for (int i = sz - 1; ~i; i--) cnt[f[i]] += cnt[i];
for(int i=sz-1;i>1;--i)ans=ans+1ll*cnt[i]*ok[i];
return ans;
}
}pam;
char s[N];
int main(){
while(scanf("%s",s)!=-1){
int n=strlen(s);
for(int i=1;i<=n;++i){
for(int j=1;j<=26;++j){
if(s[i-1]-'a'+1==j)NUM[i][j]=NUM[i-1][j]+1;
else NUM[i][j]=NUM[i-1][j];
}
}
pam.init();
for(int i=0;i
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.