經過試驗,題目資料中,有各種不合法情況,只能使用scanf %s進行讀入。否則會出現各種問題。
即使用網上別人的標程,進行修改為gets一樣會掛。
還有網上一些同學的程式對拍後出現錯誤。。也ac了,資料太弱。
我的程式十分緩慢。。。現在正在研究原因。。(2300ms)
直接ac自動機強行跑每一行的串即可
#include#include #include #include #include#include#include#includeusing namespace std;
const int sigma_size = 26;
const int maxnode = 10010;
#define prln(x) cout<<#x<<" = "int g[maxnode];//i節點,能匹配到哪個串
int pipei[1100];
void init()
// 字元c的編號
int idx(char c)
// 插入字串。v必須非0
void insert(char s, int len, int id)
now = ch[now][c];
} val[now] =1;//這裡有單詞
pipei[id] = g[now];
g[now] = id;
} // 在t中找模板,text串的下標從0開始,長度為len
void find(char text, int len, int hang)
}} }
//計算fail指標
void get_fail()
}while (!q.empty())
q.push(will);
int pre = f[now]; //失配指標,先指now的失配,至少有一段都是相等的
while (pre && !ch[pre][c]) pre = f[pre];//往前跳失配指標,類似 kmp
f[will] = ch[pre][c]; // f[i]的意義就是g[?,i]和g[0,f[i]]的字串是相等的
last[will] = val[f[will]] ? f[will] : last[f[will]];
}} }
void doit()
}ac;
char text[1010][1010];
char pattern[1100][1100];
int main() {
int t;
scanf("%d", &t);
while (t--)
{ scanf("%d%d ", &n, &m);
for (int i = 0; i
UVA11019 矩陣匹配器
題意簡化,給你乙個大矩陣和乙個小矩陣,求小矩陣在大矩陣中出現了多少次,矩陣都不得旋轉 這個題就是字串匹配的二維版,然而不像資料結構,它的二維版並不複雜只是一行行拆開處理,但複雜度十分優越,幾乎等於讀入時間 vjudge上跑了0ms 首先將小矩陣的每一行分開看,這樣小矩陣就成了多個模板串,建個ac自動...
uva題目做題記錄
一般的思路都是不開陣列直接計算,即先設乙個最大值 max,每次迴圈時將每個數的步數和 max進行比較,如果 max小於該數,交換 2數,否則繼續迴圈,直至迴圈結束。此時花費時間較多,每次輸入都要重新計算。若能將每次迴圈的結果都儲存在陣列裡,則能節省大量時間,故先生成陣列。還有,每次輸入時,都會有許多...
題目筆記 UVA12096
一道綜合set,map,stack的stl題目,非常有意思!include include include include include include include using namespace std intn,m typedef set jihe 棧 sta 裡存的都是int,而int所...