• leetcode1923 最长公共子路径


    思路:

    二分+滚动哈希。

    实现:

     1 class Solution{
     2 public:
     3     using ll=long long;
     4     struct pairhash{
     5         size_t operator()(const pair<int,int>&p)const{
     6             auto fn=hash<int>();
     7             return (fn(p.first)<<16)^fn(p.second);
     8         }
     9     };
    10     bool check(int x,vector<vector<int>>&paths){
    11         int n=paths.size();
    12         vector<unordered_set<pair<int,int>,pairhash>>st(n,unordered_set<pair<int,int>,pairhash>());
    13         ll mod=1e9+7,mod2=1e9+9;
    14         mt19937 gen{random_device{}()};
    15         auto dis=uniform_int_distribution<int>(1e6,1e7);
    16         ll b=dis(gen),b2=dis(gen),t=1,t2=1;
    17         for(int i=0;i<x-1;i++)t=t*b%mod;
    18         for(int i=0;i<x-1;i++)t2=t2*b2%mod2;
    19         for(int i=0;i<n;i++){
    20             int m=paths[i].size();
    21             if(m<x) continue;
    22             ll h=0;
    23             for(int j=0;j<x;j++){
    24                 h=(h+paths[i][j])%mod;
    25                 if(j!=x-1)h=h*b%mod;
    26             }
    27             ll h2=0;
    28             for(int j=0;j<x;j++){
    29                 h2=(h2+paths[i][j])%mod2;
    30                 if(j!=x-1)h2=h2*b2%mod2;
    31             }
    32             st[i].insert({h,h2});
    33             for(int j=x;j<m;j++){
    34                 h=(h-paths[i][j-x]*t%mod+mod)%mod;
    35                 h=h*b%mod;
    36                 h=(h+paths[i][j])%mod;
    37                 h2=(h2-paths[i][j-x]*t2%mod2+mod2)%mod2;
    38                 h2=h2*b2%mod2;
    39                 h2=(h2+paths[i][j])%mod2;
    40                 st[i].insert({h,h2});
    41             }
    42         }
    43         for(auto it:st[0]){
    44             bool flg=true;
    45             for(int j=1;j<n;j++){
    46                 if(!st[j].count(it)){
    47                     flg=false;break;
    48                 }
    49             }
    50             if(flg)return true;
    51         }
    52         return false;
    53     }
    54 
    55     int longestCommonSubpath(int n,vector<vector<int>>&paths){
    56         int m=paths.size();
    57         int minn=100001;
    58         for(int i=0;i<m;i++){
    59             minn=min(minn,(int)paths[i].size());
    60         }
    61         int l=0,r=minn,res=-1;
    62         while(l<=r){
    63             int mid=l+r>>1;
    64             if(check(mid,paths)){
    65                 res=mid;
    66                 l=mid+1;
    67             }
    68             else r=mid-1;
    69         }
    70         return res;
    71     }
    72 };
  • 相关阅读:
    IT综合学习网站收集
    使用CSS实现表格细边框的三种方式
    安装Ionic遇到的问题
    未能解析此远程名称:'nuget.org' 的解决方法
    webapi 安全验证与权限验证
    iOS模拟器可以编译,真机无法编译
    Mac上安装FFmpeg命令行
    写在工作三周年
    MPMoviePlayerController概述
    NSStream概述
  • 原文地址:https://www.cnblogs.com/wangyiming/p/16326743.html
Copyright © 2020-2023  润新知