CF 1131 E. String Multiplication
阿新 • • 發佈:2019-02-24
read long mat cstring turn pan ast ctype 分類
E. String Multiplication
題意
分析:
從後往前考慮字符串變成什麽樣子。
設$S_i = p_1 \cdot p_2 \dots p_{i}$,最後一定是$S_{n - 1} \cdot p_n$,就是將$S_{n-1}$每兩個字符之間放入$p_n$。按照$p_n$分類討論,那麽最後有三種情況。
設$p_n$的開頭字符是$c0$,結尾字符是$c1$,包含開頭的連續段的長度是$len0$,包含結尾的連續段的長度是$len1$。
1、$c0 \neq c1$,那麽答案可以是三個:(1).可以是$p_n$中最長的連續子段;(2).如果$S_{n-1}$中存在$c0$,$len0+1$;(3).如果$S_{n-1}$中存在$c1$,$len1+1$。
2、$c0 = c1$,並且整個串不只有一種字符:如果$S_{n-1}$中存在$c0$,那麽答案可以是$len0+len1+1$
3、如果$p_n$只有一種字符構成,那麽求$S_{n-1}$中最長的字符是$c0$連續段的,設為t,答案是$(t+1) \times len + t$。
可以遞歸查詢。
代碼:
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include<cctype> #include<set> #include<queue> #include<vector> #include<map> using namespace std; typedef long long LL; inline int read() { int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)f=-1; for(;isdigit(ch);ch=getchar())x=x*10+ch-‘0‘;return x*f; } constint N = 100005; string s[N]; bool a[N][26], b[N]; LL dfs(int x,char c) { if (x == 0) return 0; int ans = a[x - 1][c - ‘a‘], sz = s[x].size(); if (b[x] && s[x][0] == c) { ans = dfs(x - 1, c); return (ans + 1) * sz + ans; } else { int q = 0, h = 0, last = -1; for (int i = 0; i < sz; ++i) { if (s[x][i] == c && last == -1) last = i; if (s[x][i] == c) ans = max(ans, i - last + 1); else last = -1; } for (int i = 0; i < sz; ++i) { if (s[x][i] == c) q ++; else break; } for (int i = sz - 1; ~i; --i) { if (s[x][i] == c) h ++; else break; } if (s[x][0] == c && s[x - 1][sz - 1] == s[x][0] && a[x - 1][c - ‘a‘]) ans = max(ans, q + h + 1); if (s[x][0] == c && a[x - 1][c - ‘a‘]) ans = max(ans, q + 1); if (s[x][sz - 1] == c && a[x - 1][c - ‘a‘]) ans = max(ans, h + 1); if (s[x][0] == c) ans = max(ans, q); if (s[x][sz - 1] == c) ans = max(ans, h); return ans; } } int main() { int n = read(); for (int i = 1; i <= n; ++i) cin >> s[i], b[i] = 1; for (int i = 1; i <= n; ++i) { for (int j = 1; j < (int)s[i].size(); ++j) if (s[i][j] != s[i][j - 1]) { b[i] = 0; break; } for (int j = 0; j < (int)s[i].size(); ++j) a[i][s[i][j] - ‘a‘] = 1; for (int j = 0; j < 25; ++j) a[i][j] |= a[i - 1][j]; } int ans = 1, q = 1, h = 1, last = 0, sz = s[n].size(); for (int i = 1; i < sz; ++i) { if (last == 0 && s[n][i] == s[n][0]) q ++; if (s[n][i] == s[n][last]) ans = max(ans, i - last + 1); else last = i; } for (int i = sz - 2; i >= 0; --i) { if (s[n][i] == s[n][sz - 1]) h ++; else break; } if (!b[n]) { if (s[n][0] == s[n][sz - 1] && a[n - 1][s[n][0] - ‘a‘]) ans = max(ans, q + h + 1); if (a[n - 1][s[n][0] - ‘a‘]) ans = max(ans, q + 1); if (a[n - 1][s[n][sz - 1] - ‘a‘]) ans = max(ans, h + 1); ans = max(ans, max(q, h)); cout << ans; return 0; } int t = dfs(n - 1, s[n][0]); cout << (t + 1) * sz + t; return 0; }
CF 1131 E. String Multiplication