POJ1204 Word Puzzles

傳送門

這題果然是AC自動機的大好題!

題目的大意是,給定一個l*c的大網格,每個格子里有一個字符,每個格子可以向八個方向形成字符串,問給定的字符串在哪里能被匹配以及在網格中出現的方向(A代表北,然后依次順時針轉)

解題思路還好想,而且特別暴力:把給定的字符串建成一個AC自動機,之后對于大網格,把八個方向上所能形成的每一個串(一行,列,對角線)都視為文本串放進去匹配,然后記錄一下匹配到的位置。

然而聽著你就不想寫對不對?!

不過其實還好,把AC自動機建出來之后,我們沒必要寫8種情況,我們開一個像寬搜一樣記錄當前方向下一步與當前值的橫縱坐標之差,之后我們在匹配的時候,我們把起始點的坐標和匹配方向傳入,在里面像bfs一樣一直往下匹配,匹配到了就把答案記錄一下。

傳入起始點的話我們需要枚舉每一個邊上的點,枚舉每一個方向。

還有就是這個題的數據范圍明顯曖昧不清,都不告訴單詞有多長,一開始我數組開小RE了,然后調大(大概600000)才過的。

我不會告訴你我一開始沒搜出來是因為方向寫反了

代碼其實不長,真的,才120行。

?

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<vector>
#include<queue>
#define pb push_back
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 40005;
const int N = 600005;
const ll mod = 1000000007;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}queue <int> q;struct ans
{int id,x,y,fx,fy,nd;char di;
}a[1005];char s[1005][1005],b[1005];
int l,C,w,dx[9] = {0,-1,-1,0,1,1,1,0,-1},dy[9] = {0,0,1,1,1,0,-1,-1,-1};struct ACG
{int c[N][26],val[N],id[N],cnt,fail[N],le[N];void insert(char *p,int d){int l = strlen(p),u = 0;rep(i,0,l-1){int v = p[i] - 'A';if(!c[u][v]) c[u][v] = ++cnt;u = c[u][v];}val[u]++,id[u] = d,le[u] = l-1;}void getfail(){rep(i,0,25) if(c[0][i]) fail[c[0][i]] = 0,q.push(c[0][i]);while(!q.empty()){int k = q.front();q.pop();rep(i,0,25){if(c[k][i]) fail[c[k][i]] = c[fail[k]][i],q.push(c[k][i]);else c[k][i] = c[fail[k]][i];}}}void query(int posx,int posy,int dir){int kx = posx,ky = posy,u = 0;while(1){int v = s[kx][ky] - 'A';u = c[u][v];for(int t = u;t && val[t] != -1;t = fail[t]){if(val[t]){int px = kx - le[t] * dx[dir],py = ky - le[t] * dy[dir];a[id[t]].x = px,a[id[t]].y = py,a[id[t]].di = dir + 'A' - 1;a[id[t]].fx = posx,a[id[t]].fy = posy,a[id[t]].nd = dir;val[t] = -1;}}kx += dx[dir],ky += dy[dir];if(kx < 0 || kx > l-1 || ky < 0 || ky > C-1) break;}}
}AC;
int main()
{l = read(),C = read(),w = read();rep(i,0,l-1) scanf("%s",s[i]);rep(i,1,w) scanf("%s",b),AC.insert(b,i);AC.getfail();rep(i,0,l-1){AC.query(i,0,3),AC.query(i,C-1,7);//k = 0AC.query(i,0,2),AC.query(i,C-1,6);//k = 1AC.query(i,0,4),AC.query(i,C-1,8);//k = -1
    }rep(i,0,C-1){AC.query(0,i,5),AC.query(l-1,i,1);//k = INFAC.query(0,i,6),AC.query(l-1,i,2);//k = 1AC.query(0,i,4),AC.query(l-1,i,8);//k = -1
    }rep(i,1,w) printf("%d %d %c\n",a[i].x,a[i].y,a[i].di);//%d %d %d\n",a[i].x,a[i].y,a[i].di,a[i].fx,a[i].fy,a[i].nd);return 0;
}

?

轉載于:https://www.cnblogs.com/captain1/p/9770070.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

普通話測試系統_普通話

普通話測試系統Traduzido/adaptado do original por Vincius Barqueiro a partir do texto original “Writing Alt Text for Data Visualization”, escrito por Amy Cesal e publicado no blog Nightingale.Traduzido / adaptado由 VinciusBarqueiro 提供原始 文本“為數據可…

Mac OS 被XCode搞到無法正常開機怎么辦?

Mac OS 被XCode搞到無法正常開機怎么辦&#xff1f; 第一天拿到這臺air的時候&#xff0c;迫不及待地把從別處搜集來的XCode 3.2.5iOS SDK 4.1的dmg安裝了上來&#xff0c;結果系統直接崩潰&#xff0c;再開機就不能正常開機&#xff0c;總是碰到kernel panic。這不坑爹嗎…… …

美國隊長3:內戰_隱藏的寶石:尋找美國最好的秘密線索

美國隊長3:內戰There are plenty of reasons why one would want to find solitude in the wilderness, from the therapeutic effects of being immersed in nature, to not wanting to contribute to trail degradation and soil erosion on busier trails.人們有很多理由想要…

Java入門第三季——Java中的集合框架(中):MapHashMap

1 package com.imooc.collection;2 3 import java.util.HashSet;4 import java.util.Set;5 6 /**7 * 學生類8 * author Administrator9 * 10 */ 11 public class Student { 12 13 public String id; 14 15 public String name; 16 17 public Set<…

【譯】 WebSocket 協議第八章——錯誤處理(Error Handling)

概述 本文為 WebSocket 協議的第八章&#xff0c;本文翻譯的主要內容為 WebSocket 錯誤處理相關內容。 錯誤處理&#xff08;協議正文&#xff09; 8.1 處理 UTF-8 數據錯誤 當終端按照 UTF-8 的格式來解析一個字節流&#xff0c;但是發現這個字節流不是 UTF-8 編碼&#xff0c…

升級xcode5.1 iOS 6.0后以前的橫屏項目 變為了豎屏

升級xcode5.1 iOS 6.0后以前的橫屏項目 變為了豎屏&#xff0c;以下為解決辦法&#xff1a; 在AppDelegate 的初始化方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中 將 [window addSubview: viewCon…

動漫數據推薦系統

Simple, TfidfVectorizer and CountVectorizer recommendation system for beginner.簡單的TfidfVectorizer和CountVectorizer推薦系統&#xff0c;適用于初學者。 目標 (The Goal) Recommendation system is widely use in many industries to suggest items to customers. F…

Wait Event SQL*Net more data to client

oracle 官方給的說法是 C.3.152 SQL*Net more data to client The server process is sending more data/messages to the client. The previous operation to the client was also a send. Wait Time: The actual time it took for the send to complete 意味著server process…

1.3求根之牛頓迭代法

目錄 目錄前言&#xff08;一&#xff09;牛頓迭代法的分析1.定義2.條件3.思想4.誤差&#xff08;二&#xff09;代碼實現1.算法流程圖2.源代碼&#xff08;三&#xff09;案例演示1.求解&#xff1a;\(f(x)x^3-x-10\)2.求解&#xff1a;\(f(x)x^2-1150\)3.求解&#xff1a;\(f…

libzbar.a armv7

楊航最近在學IOS&#xfeff;&#xfeff; http://download.csdn.net/download/lzwxyz/5546365 我現在用的是這個&#xff1a;http://www.federicocappelli.net/2012/10/05/zbar-library-for-iphone-5-armv7s/ 點它的HERE開始下載 下載的libzbar.a庫&#xff0c;如何查看 …

Alex Hanna博士:Google道德AI小組研究員

Alex Hanna博士是社會學家和研究科學家&#xff0c;致力于Google的機器學習公平性和道德AI。 (Dr. Alex Hanna is a sociologist and research scientist working on machine learning fairness and ethical AI at Google.) Before that, she was an Assistant Professor at th…

三位對我影響最深的老師

我感覺&#xff0c;教過我的老師們&#xff0c;不論他們技術的好壞對我都是有些許影響的。但是讓人印象最深的好像只有寥寥幾位。 第一位就是小學六年級下冊教過我的語文老師。他是臨時從一個貧困小學調任過來的&#xff0c;不怎么管班級&#xff0c;班里同學都在背地里說他不會…

安全開發 | 如何讓Django框架中的CSRF_Token的值每次請求都不一樣

前言 用過Django 進行開發的同學都知道&#xff0c;Django框架天然支持對CSRF攻擊的防護&#xff0c;因為其內置了一個名為CsrfViewMiddleware的中間件&#xff0c;其基于Cookie方式的防護原理&#xff0c;相比基于session的方式&#xff0c;更適合目前前后端分離的業務場景&am…

UNITY3D 腦袋頂血頂名

&#xfeff;&#xfeff;楊航最近在學Unity3D&#xfeff;&#xfeff; using UnityEngine; using System.Collections; public class NPC : MonoBehaviour { //主攝像機對象 public Camera camera; //NPC名稱 private string name "我是doud…

一個項目的整個測試流程

最近一直在進行接口自動化的測試工作&#xff0c;同時對于一個項目的整個測試流程進行了梳理&#xff0c;希望能對你有用~~~ 需求分析&#xff1a; 整體流程圖&#xff1a; 需求提取 -> 需求分析 -> 需求評審 -> 更新后的測試需求跟蹤xmind 分析流程&#xff1a; 1. 需…

python度量學習_Python的差異度量

python度量學習Hi folks, welcome back to my new edition of the blog, thank you so much for your love and support, I hope you all are doing well. In today’s learning, we will try to understand about variance and the measures involved in it. Although the blo…

多個攝像機之間的切換

楊航最近在學Unity3D&#xfeff;&#xfeff; Unity3D入門 第捌章: 多個攝像機之間的切換 內容描述&#xff1a;這章&#xff0c;我們來學習一下同個場景中多個攝像機怎么切換。 接著我們創建一個空對象 GameObject -> Create Empty 命名為CamearController&#xff0…

Kubernetes的共享GPU集群調度

問題背景 全球主要的容器集群服務廠商的Kubernetes服務都提供了Nvidia GPU容器調度能力&#xff0c;但是通常都是將一個GPU卡分配給一個容器。這可以實現比較好的隔離性&#xff0c;確保使用GPU的應用不會被其他應用影響&#xff1b;對于深度學習模型訓練的場景非常適合&#x…

django-celery定時任務以及異步任務and服務器部署并且運行全部過程

Celery 應用Celery之前&#xff0c;我想大家都已經了解了&#xff0c;什么是Celery&#xff0c;Celery可以做什么&#xff0c;等等一些關于Celery的問題&#xff0c;在這里我就不一一解釋了。 應用之前&#xff0c;要確保環境中添加了Celery包。 pip install celery pip instal…

網頁視頻15分鐘自動暫停_在15分鐘內學習網頁爬取

網頁視頻15分鐘自動暫停什么是網頁抓取&#xff1f; (What is Web Scraping?) Web scraping, also known as web data extraction, is the process of retrieving or “scraping” data from a website. This information is collected and then exported into a format that …