UVA11019 矩陣匹配器

2021-08-18 02:33:18 字數 1160 閱讀 6059

題意簡化,給你乙個大矩陣和乙個小矩陣,求小矩陣在大矩陣中出現了多少次,矩陣都不得旋轉

這個題就是字串匹配的二維版,然而不像資料結構,它的二維版並不複雜只是一行行拆開處理,但複雜度十分優越,幾乎等於讀入時間(vjudge上跑了0ms)

首先將小矩陣的每一行分開看,這樣小矩陣就成了多個模板串,建個ac自動機。再用大矩陣的每一行去ac自動機裡找匹配,例如大矩陣第i行的第j位與第k個模板串(小矩陣第k行)匹配上了,那麼(i-(k-1),j)就是乙個滿足一行相等的右上角。開個c陣列儲存乙個點作為右上角的小矩陣與目標小矩陣有幾行一樣,這樣c[i][j]=x的點就是合法點。統計一下合法點的個數,即為答案

#include#include#include#include#define maxn (1010)

using namespace std;

int a[maxn][maxn],b[maxn][maxn],n,m,x,y,son[maxn*maxn][151];

int size,c[maxn][maxn],f[maxn*maxn],h[maxn*maxn],m1;

char s[maxn];

struct edge

}q[maxn*maxn];

void addedge(int x,int y)

void build(int num)

addedge(rt,num);

}void get_fail()

q.push(son[x][i]);

int v=f[x],u=son[x][i];

while (v&&!son[v][i]) v=f[v];

f[u]=son[v][i];

} }}void find(int num) }}

void work()

scanf("%d %d",&x,&y);

for (i=1;i<=x;i++)

get_fail();

for (i=1;i<=n;i++)

find(i);

int ans=0;

for (i=1;i<=n;i++)

for (j=1;j<=m;j++)

if (c[i][j]==x) ans++;

printf("%d\n",ans);

}int main()

uva 11019 題目資料不合法!

經過試驗,題目資料中,有各種不合法情況,只能使用scanf s進行讀入。否則會出現各種問題。即使用網上別人的標程,進行修改為gets一樣會掛。還有網上一些同學的程式對拍後出現錯誤。也ac了,資料太弱。我的程式十分緩慢。現在正在研究原因。2300ms 直接ac自動機強行跑每一行的串即可 include...

UVA 11019 AC自動機 二維模式串匹配

oj 簡單翻譯 給你乙個n m的字元矩陣t,在給你乙個x y的字元矩陣p,問p在t中能完全匹配幾個位置。這個題我們利用ac自動機解決首先要解決兩個問題 1.要想p與t的的某個位置完全匹配,那麼p的每一行要與t的對應的部分匹配,所以可以把p每一行看成模式串構造出ac自動機。然後在t中每一行逐一匹配,找...

uva 11419 最大匹配

include include include include include include using namespace std const int maxn 1e4 5 int r,c,n,x,y struct bpm void addedge int u,int v bool match ...