DuongNhi99

LAUGH

Dec 14th, 2020
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.56 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6. #define rep(i,a,b) for(int i = a; i <= b; ++i)
  7. #define repr(i,a,b) for(int i = a; i>=b; --i)
  8. #define maxn 100005
  9. #define ii pair <int, int>
  10. #define se second
  11. #define fi first
  12. #define base 5
  13. #define mod 1000000007ll
  14. ll T[maxn], P[maxn];
  15. int n, m;
  16. string s;
  17.  
  18. int getc(char c){
  19.     if(c=='h') return 4;
  20.     return c - 'a' + 1;
  21. }
  22.  
  23. void init(){
  24.     cin>>n>>s;
  25.     m = s.size();
  26.     P[0] = 1;
  27.     rep(i,1,m + 2){
  28.         P[i] = (P[i-1] * base) % mod;
  29.     }
  30.     T[0] = 0;
  31.     rep(i,0,m-1){
  32.         T[i+1] = (T[i]*base + getc(s[i]))%mod;
  33.     }
  34. }
  35.  
  36. int getT(const string &s){
  37.     ll ans = 0;
  38.     for(char c:s){
  39.         ans = ans*base + getc(c);
  40.         ans %= mod;
  41.     }
  42.     return ans;
  43. }
  44.  
  45. int getH(int i, int j){
  46.     return (T[j] - T[i-1]*P[j-i+1] + mod*mod)%mod;
  47. }
  48.  
  49. int f[maxn];
  50.  
  51. int main(){
  52.     ios_base::sync_with_stdio(false); cin.tie(0);
  53.     freopen("LAUGH.inp", "r", stdin);
  54.     freopen("LAUGH.out", "w", stdout);
  55.     init();
  56.     vector <ii> H(n);
  57.     for(ii &i:H){
  58.         string s;
  59.         cin>>s;
  60.         i = ii(getT(s), s.size());
  61.     }
  62.     repr(i,m,1){
  63.         for(ii &j:H){
  64.             int r = i + j.se - 1;
  65.             if(r>m) continue;
  66.             if(getH(i, r) == j.fi) f[i] = max(f[i], f[r+1] + j.se);
  67.         }
  68.     }
  69.     int ans = 0;
  70.     rep(i,1,m) ans = max(ans, f[i]);
  71.     cout<<ans;
  72.     return 0;
  73. }
  74. // Created by BJMinhNhut
  75. #include <bits/stdc++.h>
  76. using namespace std;
  77. #define all(x) (x).begin(), (x).end()
  78. #define rall(x) x.rbegin(), x.rend()
  79. #define pb push_back
  80. #define mp make_pair
  81. #define F first
  82. #define S second
  83. typedef int64_t ll;
  84. typedef vector<int> vi;
  85. typedef vector<ll> vll;
  86. void fast_io() {ios::sync_with_stdio(0); cin.tie(0);}
  87.  
  88. /***Main Code***/
  89. #define DEBUG 0
  90. #define FILE_IO 1
  91.  
  92. struct node {
  93.     int nxt['h'-'a'+1];
  94.     bool endStr;
  95.     node() {
  96.         memset(nxt, -1, sizeof nxt);
  97.         endStr = false;
  98.     }
  99. };
  100. vector<node> trie(1);
  101. int n;
  102. string s;
  103. const int N = 1e5+5;
  104. int dp[N];
  105.  
  106. void add(string &s) {
  107.     int u = 0;
  108.     for(char &ch : s) {
  109.         int c = ch-'a';
  110.         if (trie[u].nxt[c] == -1) {
  111.             trie[u].nxt[c] = trie.size();
  112.             trie.emplace_back();
  113.         }
  114.         u = trie[u].nxt[c];
  115.     }
  116.     trie[u].endStr = true;
  117. }
  118.  
  119. void Input() {
  120.     cin >> n;
  121.     cin >> s;
  122.     string tmp;
  123.     for(int i = 0; i < n; ++i) {
  124.         cin >> tmp;
  125.         add(tmp);
  126.     }
  127. }
  128.  
  129. int DP(int i) {
  130.     int &res = dp[i];
  131.     if (res != -1) return res;
  132.     res = 0;
  133.     int u = 0;
  134.     for(int j = i; j < s.length(); ++j) {
  135.         int c = s[j] - 'a';
  136.         if (trie[u].nxt[c] == -1) break;
  137.         u = trie[u].nxt[c];
  138.         if (trie[u].endStr) res = max(res, (j-i+1) + DP(j+1));
  139.     }
  140.     return res;
  141. }
  142.  
  143. void Solve() {
  144.     memset(dp, -1, sizeof dp);
  145.     int ans = 0;
  146.     for(int i = 0; i < s.length(); ++i) {
  147.         ans = max(ans, DP(i));
  148.     }
  149.     cout << ans;
  150. }
  151.  
  152. int main()
  153. {
  154.     fast_io();
  155.     if (FILE_IO) {
  156.         #define task "LAUGH"
  157.         freopen(task".inp", "r", stdin);
  158.         freopen(task".out", "w", stdout);
  159.     }
  160.  
  161.     Input(), Solve();
  162.  
  163.     if (DEBUG) cout << "\nTime: " << clock()/1000.0 << "s";
  164.     return 0;
  165. }
  166. #include <bits/stdc++.h>
  167.  
  168. using namespace std;
  169.  
  170. const int N = 1e5 + 7;
  171.  
  172. int n, f[N];
  173. string s;
  174.  
  175. struct trie{
  176.     bool en;
  177.     trie *child[26];
  178. } *root;
  179.  
  180. trie *create()
  181. {
  182.     trie *node = new trie();
  183.     node->en = false;
  184.     for(int i = 0; i < 26; ++i) node->child[i] = nullptr;
  185.     return node;
  186. }
  187.  
  188. void add(trie *node, const string &s)
  189. {
  190.     for(auto ch = s.rbegin(); ch != s.rend(); ++ch){
  191.         //cout << (*ch);
  192.         int u = (*ch) - 'a';
  193.         if(node->child[u] == nullptr) node->child[u] = create();
  194.         node = node->child[u];
  195.     }
  196.     //cout << '\n';
  197.     node->en = true;
  198. }
  199.  
  200. int main()
  201. {
  202.     ios_base::sync_with_stdio(0); cin.tie(0);
  203.     freopen("LAUGH.inp","r",stdin);
  204.     freopen("LAUGH.out","w",stdout);
  205.     root = create();
  206.     cin >> n;
  207.     cin >> s;
  208.     for(int i = 0; i < n; ++i){
  209.         string p; cin >> p;
  210.         add(root, p);
  211.     }
  212.     trie *node = root;
  213.     s = " " + s;
  214.     int ans = 0;
  215.     for(int i = 1; i < s.size(); ++i){
  216.         trie *node = root;
  217.         for(int j = i; j > max(0, i - 33); --j){
  218.             int v = s[j] - 'a';
  219.             if(node->child[v] != nullptr){
  220.                 node = node->child[v];
  221.                 if(node->en) f[i] = max(f[i], f[j - 1] + (i - j + 1));
  222.             }else break;
  223.         }
  224.         ans = max(ans, f[i]);
  225.     }
  226.     cout << ans << '\n';
  227.     return 0;
  228. }
  229. #include <bits/stdc++.h>
  230.  
  231. #define Task "LAUGH"
  232. #define siz(x) int(x.size())
  233. #define reset(x) memset(x, 0, sizeof(x))
  234. #define rep(i, l, r) for (int i = (l); i <= (r); ++i)
  235. #define Rep(i, r, l) for (int i = (r); i >= (l); --i)
  236. #define pb push_back
  237. //#define mp make_pair
  238. #define ff first
  239. #define ss second
  240. #define N 100005
  241. #define MOD 1000000007
  242. #define remain(x) if (x > MOD) x -= MOD
  243. #define all(x) (x).begin(), (x).end()
  244.  
  245. using namespace std;
  246.  
  247. typedef long long ll;
  248. typedef pair<int, int> ii;
  249. typedef vector<ii> vii;
  250. typedef vector<int> vi;
  251. typedef pair<int, pair<int, int>> iii;
  252. typedef vector<iii> viii;
  253.  
  254. const int inf = 1e9 * 2 + 10;
  255. const ll INF = 1e18 * 2 + 10;
  256.  
  257. map<char, int> mp;
  258.  
  259. struct Node
  260. {
  261.     struct Node *children[5];
  262.     bool leaf;
  263.     Node()
  264.     {
  265.         rep(i, 0, 4) children[i] = NULL;
  266.         leaf = false;
  267.     }
  268. };
  269.  
  270. void addstring(struct Node *root, string s)
  271. {
  272.     struct Node *curr = root;
  273.     rep(i, 0, siz(s) - 1)
  274.     {
  275.         if (!curr->children[mp[s[i]]]) curr->children[mp[s[i]]] = new Node();
  276.         curr = curr->children[mp[s[i]]];
  277.     }
  278.     curr->leaf = true;
  279. }
  280. struct Node *root;
  281. int n, dp[N];
  282. string s;
  283. int main()
  284. {
  285.     freopen(Task".inp", "r", stdin);
  286.     freopen(Task".out", "w", stdout);
  287.     //do your task Bii_i
  288.     root = new Node();
  289.     cin >> n >> s;
  290.     s = '0' + s;
  291.     mp['a'] = 0;
  292.     mp['b'] = 1;
  293.     mp['c'] = 2;
  294.     mp['h'] = 3;
  295.     rep(i, 0, n - 1)
  296.     {
  297.         string x;
  298.         cin >> x;
  299.         reverse(all(x));
  300.         addstring(root, x);
  301.     }
  302.     int ans = 0;
  303.     rep(i, 1, siz(s) - 1)
  304.     {
  305.         struct Node *curr = root;
  306.         Rep(j, i, 1)
  307.         {
  308.             if (!curr->children[mp[s[j]]]) break;
  309.             curr = curr->children[mp[s[j]]];
  310.             if (curr->leaf)
  311.                 dp[i] = max(dp[i], dp[j - 1] + (i - j + 1));
  312.         }
  313.         ans = max(ans, dp[i]);
  314.     }
  315.     //rep(i, 1, siz(s) - 1) cout << dp[i] << " ";
  316.     cout << ans;
  317.     return 0;
  318. }
Advertisement
Add Comment
Please, Sign In to add comment