Codeforces Round #244 (Div. 2)

A. Police Recruits

B. Prison Transfer

A,B两个是水题。

C. Checkposts

DFS找出所有的环就行了。

每次搜索一个结点u时,给u加一个递增标号low[u],同时记录搜索u及u的子结点过程中遇到的最小标号minc,也就是当搜索u的子结点v时,minc = min(minc, low[v])。搜索完成后,如果minc < low[u],说明搜索u的子结点时又回到了u的父结点,也就是说u在一个环中,然后求出这个环的最小费用及取到最小费用的结点数。

D. Match & Catch

首先把原问题转换一下:
对于位于字符串str1和str2的两个位置p(str1中)和q(str2中):记suffix(p)和str1的LCS长度为len1,suffix(q)和str2的LCS长度为len2,suffix(p)和suffix(q)的LCS长度为len。其中suffix(i)表示从位置i开头的后缀,LCS是最长公共子串,那么题目要求的就是满足条件len > max(len1, len2)的最小的max(len1, len2)。取答案为ans = max(len1, len2) + 1,那么子串(p..p+ans-1)在str1中惟一,因为不惟一的最长子串长度为ans - 1。同样q也惟一。同时(p..p+ans-1)是str1和str2的公共子串(它是suffix(p)和suffix(q)的公共子串)。所以原问题就变成了一个纯后缀数组题目。
不知道为什么把这个题放在最后一题,感觉完全是个水题。。。。
//Problem C
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
         #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
               
                 #include 
                
                  #include 
                 
                   #include 
                  
                    #define mp make_pair using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; typedef pair 
                   
                     pii; typedef vector 
                    
                      vi; typedef vi::iterator vi_it; typedef map 
                     
                       mii; typedef priority_queue 
                      
                        pqi; typedef priority_queue 
                       
                         , greater 
                        
                          > rpqi; const int MAX_N = (int)1.0e5 + 2; const int MOD = (int)1.0e9 + 7; int cost[MAX_N], dns[MAX_N], q[MAX_N], low[MAX_N]; int top = 0, cnt = 0; vi link[MAX_N]; ll ans[2] = {0, 1}; void dfs(int u) { int minc = dns[u] = low[u] = ++cnt; q[top++] = u; int w; for (vi_it it = link[u].begin(); it != link[u].end(); ++it) { if (!dns[w = *it]) { dfs(w); } minc = min(minc, low[w]); } if (minc < low[u]) { low[u] = minc; return; } int tc = 0, minv = INT_MAX; do { low[w = q[--top]] = INT_MAX; if (minv > cost[w]) { minv = cost[w]; tc = 1; } else if (minv == cost[w]) { ++tc; } } while (w != u); ans[0] += minv; ans[1] = ans[1] * tc % MOD; } int main(int argc, char *argv[]) { // freopen("D:\\in.txt", "r", stdin); int n, m, i; cin >> n; for (i = 1; i <= n; ++i) { scanf("%d", cost + i); } cin >> m; while (m--) { int u, v; scanf("%d%d", &u, &v); link[u].push_back(v); } for (i = 1; i <= n; ++i) { if (!dns[i]) { dfs(i); } } printf("%I64d %I64d\n", ans[0], ans[1]); return 0; } //Problem D #include 
                         
                           #include 
                          
                            #include 
                           
                             #include 
                            
                              #include 
                             
                               #include 
                               #include 
                               
                                 #include 
                                
                                  #include 
                                 
                                   #include 
                                  
                                    #include 
                                   
                                     #include 
                                    
                                      #include 
                                     
                                       #include 
                                      
                                        #include 
                                       
                                         #include 
                                        
                                          #define mp make_pair using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; typedef pair 
                                         
                                           pii; typedef vector 
                                          
                                            vi; typedef vi::iterator vi_it; typedef map 
                                           
                                             mii; typedef priority_queue 
                                            
                                              pqi; typedef priority_queue 
                                             
                                               , greater 
                                              
                                                > rpqi; const int MAX_LEN = 10000 + 10; char str[MAX_LEN]; int num[MAX_LEN]; int sa[MAX_LEN], rank[MAX_LEN], height[MAX_LEN]; int wa[MAX_LEN], wb[MAX_LEN], wv[MAX_LEN], wd[MAX_LEN]; int cnt; int cmp(int* r, int a, int b, int l){ return r[a] == r[b] && r[a + l] == r[b + l]; } void da(int* r, int n, int m) { int i, j, p; int* x = wa; int* y = wb; int* t; for (i = 0; i < m; ++i) wd[i] = 0; for (i = 0; i < n; ++i) wd[x[i] = r[i]]++; for (i = 1; i < m; ++i) wd[i] += wd[i - 1]; for (i = n - 1; i >= 0; --i) sa[--wd[x[i]]] = i; for (j = 1, p = 1; p < n; j *= 2, m = p) { for (p = 0, i = n - j; i < n; ++i) y[p++] = i; for (i = 0; i < n; ++i) if (sa[i] >= j) y[p++] = sa[i] - j; for (i = 0; i < n; ++i) wv[i] = x[y[i]]; for (i = 0; i < m; ++i) wd[i] = 0; for (i = 0; i < n; ++i) ++wd[wv[i]]; for (i = 1; i < m; ++i) wd[i] += wd[i - 1]; for (i = n - 1; i >= 0; --i) sa[--wd[wv[i]]] = y[i]; for (t = x, x = y, y = t, p = 1, x[sa[0]] = 0, i = 1; i < n; ++i) { x[sa[i]] = cmp(y, sa[i-1], sa[i], j) ? p - 1: p++; } } } void calHeight(int* r, int n) { int i, j, k = 0; for (i = 1; i <= n; ++i) rank[sa[i]] = i; for (i = 0; i < n; height[rank[i++]] = k) { for (k ? k -- : 0, j = sa[rank[i] - 1]; r[i + k] == r[j + k]; ++k); } } int main(int argc, char *argv[]) { // freopen("D:\\in.txt", "r", stdin); int i, k, l1, l2; scanf("%s", str); l1 = strlen(str); for (k = i = 0; i < l1; ++i) { num[k++] = str[i] - 'a' + 2; } num[k++] = 1; scanf("%s", str); l2 = strlen(str); for (i = 0; i < l2; ++i) { num[k++] = str[i] - 'a' + 2; } int n = l1 + l2; da(num, n + 1, 30); calHeight(num, n); int ans = INT_MAX; for (i = 2; i < k; i ++) { if ((sa[i] < l1) ^ (sa[i - 1] < l1) && height[i] > height[i -1] && height[i] > height[i + 1]){ ans = min(ans, max(height[i - 1], height[i + 1]) + 1); } } if (ans == INT_MAX) { puts("-1"); } else { cout << ans << endl; } return 0; } //Problem E #include 
                                               
                                                 #include 
                                                
                                                  #include 
                                                 
                                                   #include 
                                                  
                                                    #include 
                                                   
                                                     #include 
                                                     #include 
                                                     
                                                       #include 
                                                      
                                                        #include 
                                                       
                                                         #include 
                                                        
                                                          #include 
                                                         
                                                           #include 
                                                          
                                                            #include 
                                                           
                                                             #include 
                                                            
                                                              #include 
                                                             
                                                               #include 
                                                              
                                                                #define mp make_pair using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; typedef pair 
                                                               
                                                                 pii; typedef vector 
                                                                
                                                                  vi; typedef vi::iterator vi_it; typedef map 
                                                                 
                                                                   mii; typedef priority_queue 
                                                                  
                                                                    pqi; typedef priority_queue 
                                                                   
                                                                     , greater 
                                                                    
                                                                      > rpqi; const int MAX_N = 1000000 + 2; int pos[MAX_N]; int main(int argc, char *argv[]) { // freopen("D:\\in.txt", "r", stdin); int n, m, i, j; cin >> n >> m; for (i = 0; i < n; ++i) { scanf("%d", pos + i); } ll ans = 0; for (i = 0, j = n - 1; j - i >= (m << 1); i += m, j -= m) { ans += pos[j] - pos[i]; ans += pos[j] - pos[i]; } if (j > i) { ans += pos[j] - pos[i]; ans += pos[j] - pos[i]; } printf("%I64d\n", ans); return 0; } 
                                                                     
                                                                    
                                                                   
                                                                  
                                                                 
                                                                
                                                               
                                                              
                                                             
                                                            
                                                           
                                                          
                                                         
                                                        
                                                       
                                                      
                                                    
                                                   
                                                  
                                                 
                                                
                                               
                                              
                                             
                                            
                                           
                                          
                                         
                                        
                                       
                                      
                                     
                                    
                                   
                                  
                                 
                                
                              
                             
                            
                           
                          
                         
                        
                       
                      
                     
                    
                   
                  
                 
                
               
              
             
            
           
          
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值