Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define rep(i,a,b) for(int i = a; i <= b; ++i)
- #define repr(i,a,b) for(int i = a; i>=b; --i)
- #define maxn 100005
- #define ii pair <int, int>
- #define se second
- #define fi first
- #define base 5
- #define mod 1000000007ll
- ll T[maxn], P[maxn];
- int n, m;
- string s;
- int getc(char c){
- if(c=='h') return 4;
- return c - 'a' + 1;
- }
- void init(){
- cin>>n>>s;
- m = s.size();
- P[0] = 1;
- rep(i,1,m + 2){
- P[i] = (P[i-1] * base) % mod;
- }
- T[0] = 0;
- rep(i,0,m-1){
- T[i+1] = (T[i]*base + getc(s[i]))%mod;
- }
- }
- int getT(const string &s){
- ll ans = 0;
- for(char c:s){
- ans = ans*base + getc(c);
- ans %= mod;
- }
- return ans;
- }
- int getH(int i, int j){
- return (T[j] - T[i-1]*P[j-i+1] + mod*mod)%mod;
- }
- int f[maxn];
- int main(){
- ios_base::sync_with_stdio(false); cin.tie(0);
- freopen("LAUGH.inp", "r", stdin);
- freopen("LAUGH.out", "w", stdout);
- init();
- vector <ii> H(n);
- for(ii &i:H){
- string s;
- cin>>s;
- i = ii(getT(s), s.size());
- }
- repr(i,m,1){
- for(ii &j:H){
- int r = i + j.se - 1;
- if(r>m) continue;
- if(getH(i, r) == j.fi) f[i] = max(f[i], f[r+1] + j.se);
- }
- }
- int ans = 0;
- rep(i,1,m) ans = max(ans, f[i]);
- cout<<ans;
- return 0;
- }
- // Created by BJMinhNhut
- #include <bits/stdc++.h>
- using namespace std;
- #define all(x) (x).begin(), (x).end()
- #define rall(x) x.rbegin(), x.rend()
- #define pb push_back
- #define mp make_pair
- #define F first
- #define S second
- typedef int64_t ll;
- typedef vector<int> vi;
- typedef vector<ll> vll;
- void fast_io() {ios::sync_with_stdio(0); cin.tie(0);}
- /***Main Code***/
- #define DEBUG 0
- #define FILE_IO 1
- struct node {
- int nxt['h'-'a'+1];
- bool endStr;
- node() {
- memset(nxt, -1, sizeof nxt);
- endStr = false;
- }
- };
- vector<node> trie(1);
- int n;
- string s;
- const int N = 1e5+5;
- int dp[N];
- void add(string &s) {
- int u = 0;
- for(char &ch : s) {
- int c = ch-'a';
- if (trie[u].nxt[c] == -1) {
- trie[u].nxt[c] = trie.size();
- trie.emplace_back();
- }
- u = trie[u].nxt[c];
- }
- trie[u].endStr = true;
- }
- void Input() {
- cin >> n;
- cin >> s;
- string tmp;
- for(int i = 0; i < n; ++i) {
- cin >> tmp;
- add(tmp);
- }
- }
- int DP(int i) {
- int &res = dp[i];
- if (res != -1) return res;
- res = 0;
- int u = 0;
- for(int j = i; j < s.length(); ++j) {
- int c = s[j] - 'a';
- if (trie[u].nxt[c] == -1) break;
- u = trie[u].nxt[c];
- if (trie[u].endStr) res = max(res, (j-i+1) + DP(j+1));
- }
- return res;
- }
- void Solve() {
- memset(dp, -1, sizeof dp);
- int ans = 0;
- for(int i = 0; i < s.length(); ++i) {
- ans = max(ans, DP(i));
- }
- cout << ans;
- }
- int main()
- {
- fast_io();
- if (FILE_IO) {
- #define task "LAUGH"
- freopen(task".inp", "r", stdin);
- freopen(task".out", "w", stdout);
- }
- Input(), Solve();
- if (DEBUG) cout << "\nTime: " << clock()/1000.0 << "s";
- return 0;
- }
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e5 + 7;
- int n, f[N];
- string s;
- struct trie{
- bool en;
- trie *child[26];
- } *root;
- trie *create()
- {
- trie *node = new trie();
- node->en = false;
- for(int i = 0; i < 26; ++i) node->child[i] = nullptr;
- return node;
- }
- void add(trie *node, const string &s)
- {
- for(auto ch = s.rbegin(); ch != s.rend(); ++ch){
- //cout << (*ch);
- int u = (*ch) - 'a';
- if(node->child[u] == nullptr) node->child[u] = create();
- node = node->child[u];
- }
- //cout << '\n';
- node->en = true;
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0);
- freopen("LAUGH.inp","r",stdin);
- freopen("LAUGH.out","w",stdout);
- root = create();
- cin >> n;
- cin >> s;
- for(int i = 0; i < n; ++i){
- string p; cin >> p;
- add(root, p);
- }
- trie *node = root;
- s = " " + s;
- int ans = 0;
- for(int i = 1; i < s.size(); ++i){
- trie *node = root;
- for(int j = i; j > max(0, i - 33); --j){
- int v = s[j] - 'a';
- if(node->child[v] != nullptr){
- node = node->child[v];
- if(node->en) f[i] = max(f[i], f[j - 1] + (i - j + 1));
- }else break;
- }
- ans = max(ans, f[i]);
- }
- cout << ans << '\n';
- return 0;
- }
- #include <bits/stdc++.h>
- #define Task "LAUGH"
- #define siz(x) int(x.size())
- #define reset(x) memset(x, 0, sizeof(x))
- #define rep(i, l, r) for (int i = (l); i <= (r); ++i)
- #define Rep(i, r, l) for (int i = (r); i >= (l); --i)
- #define pb push_back
- //#define mp make_pair
- #define ff first
- #define ss second
- #define N 100005
- #define MOD 1000000007
- #define remain(x) if (x > MOD) x -= MOD
- #define all(x) (x).begin(), (x).end()
- using namespace std;
- typedef long long ll;
- typedef pair<int, int> ii;
- typedef vector<ii> vii;
- typedef vector<int> vi;
- typedef pair<int, pair<int, int>> iii;
- typedef vector<iii> viii;
- const int inf = 1e9 * 2 + 10;
- const ll INF = 1e18 * 2 + 10;
- map<char, int> mp;
- struct Node
- {
- struct Node *children[5];
- bool leaf;
- Node()
- {
- rep(i, 0, 4) children[i] = NULL;
- leaf = false;
- }
- };
- void addstring(struct Node *root, string s)
- {
- struct Node *curr = root;
- rep(i, 0, siz(s) - 1)
- {
- if (!curr->children[mp[s[i]]]) curr->children[mp[s[i]]] = new Node();
- curr = curr->children[mp[s[i]]];
- }
- curr->leaf = true;
- }
- struct Node *root;
- int n, dp[N];
- string s;
- int main()
- {
- freopen(Task".inp", "r", stdin);
- freopen(Task".out", "w", stdout);
- //do your task Bii_i
- root = new Node();
- cin >> n >> s;
- s = '0' + s;
- mp['a'] = 0;
- mp['b'] = 1;
- mp['c'] = 2;
- mp['h'] = 3;
- rep(i, 0, n - 1)
- {
- string x;
- cin >> x;
- reverse(all(x));
- addstring(root, x);
- }
- int ans = 0;
- rep(i, 1, siz(s) - 1)
- {
- struct Node *curr = root;
- Rep(j, i, 1)
- {
- if (!curr->children[mp[s[j]]]) break;
- curr = curr->children[mp[s[j]]];
- if (curr->leaf)
- dp[i] = max(dp[i], dp[j - 1] + (i - j + 1));
- }
- ans = max(ans, dp[i]);
- }
- //rep(i, 1, siz(s) - 1) cout << dp[i] << " ";
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment