ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

奶牛矩阵

2019-07-28 09:01:23  阅读:374  来源: 互联网

标签:覆盖 int 矩阵 15000 字符串 奶牛 define


奶牛矩阵

给出一个\(R\times C\)的字符矩阵,询问其最小的覆盖矩阵,定义一个覆盖矩阵为其不断的自我复制扩张以后原字符矩阵为其子矩阵,\(1≤R≤10000,1≤C≤75\)。

从简单开始研究,刚开始不要研究二维,对于一行而言,我们发现一个结论,也就是它的覆盖矩阵,必然可以对齐左端,画张图自我理解,于是可以推广到二维中,必然可以对齐左上角。

此外从答案的角度来看,发现存在行列独立的性质,也就是对于一个子矩阵无限扩张,覆盖了原矩阵,我们可以把R行字符压成一行,接下来就变成一个字符串的子矩阵问题,同样可以对列进行处理,这样求出来的两个子矩阵长度的乘积就是我们的答案(感觉上模模糊糊是对的,很有道理,我也说不清)。

如何将多行压成一行,hash就可以了,于是接下来就变成一个字符串问题了,如何求一个字符串的"覆盖子串",我们需要寻找算法坐载体,字符串我们学过hash,kmp,trie,最小表示法,还有一些模型(如最长回文子串),不妨考虑kmp,然后发现一个性质,最小"覆盖子串"的长度也就是字符串长度-next[字符串长度],自我画图理解一下即可。

最后时间复杂度我们可以做到\(O(RC)\)。

参考代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define ri register
#define ll long long
#define ull unsigned ll
#define jzm 19260817
using namespace std;
char s[15000][100];
int Next[15000];
ull qz[15000],base[15000];
il int kmp(int);
il void get(char&);
int main(){
    int r,c,ans(1);base[0]=1;
    for(int i(1);i<=10000;++i)
        base[i]=base[i-1]*jzm;
    scanf("%d%d",&r,&c);
    for(int i(1),j;i<=r;++i)
        for(j=1;j<=c;++j)
            get(s[i][j]);
    for(int i(1),j;i<=r;++i)
        for(j=1;j<=c;++j)
            qz[i]=qz[i]*jzm+s[i][j];
    ans=kmp(r),memset(qz,0,sizeof(qz));
    for(int i(1),j;i<=c;++i)
        for(j=1;j<=r;++j)
            qz[i]=qz[i]*jzm+s[j][i];
    ans*=kmp(c),printf("%d",ans);
    return 0;
}
il int kmp(int n){
    for(int i(2),j(0);i<=n;++i){
        while(j&&qz[i]!=qz[j+1])j=Next[j];
        if(qz[i]==qz[j+1])++j;Next[i]=j;
    }return n-Next[n];
}
il void get(char &c){
    while(c=getchar(),c==' '||c=='\n'||c=='\r');
}

标签:覆盖,int,矩阵,15000,字符串,奶牛,define
来源: https://www.cnblogs.com/a1b3c7d9/p/11257706.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有