[HNOI2004]L語言

1212: [HNOI2004]L語言

Time Limit:?10 Sec??Memory Limit:?162 MB
Submit:?1507??Solved:?666
[Submit][Status][Discuss]

Description

標點符號的出現晚于文字的出現,所以以前的語言都是沒有標點的。現在你要處理的就是一段沒有標點的文章。 一段文章T是由若干小寫字母構成。一個單詞W也是由若干小寫字母構成。一個字典D是若干個單詞的集合。 我們稱一段文章T在某個字典D下是可以被理解的,是指如果文章T可以被分成若干部分,且每一個部分都是字典D中的單詞。 例如字典D中包括單詞{‘is’, ‘name’, ‘what’, ‘your’},則文章‘whatisyourname’是在字典D下可以被理解的 因為它可以分成4個單詞:‘what’, ‘is’, ‘your’, ‘name’,且每個單詞都屬于字典D,而文章‘whatisyouname’ 在字典D下不能被理解,但可以在字典D’=D+{‘you’}下被理解。這段文章的一個前綴‘whatis’,也可以在字典D下被理解 而且是在字典D下能夠被理解的最長的前綴。 給定一個字典D,你的程序需要判斷若干段文章在字典D下是否能夠被理解。 并給出其在字典D下能夠被理解的最長前綴的位置。

Input

輸入文件第一行是兩個正整數n和m,表示字典D中有n個單詞,且有m段文章需要被處理。 之后的n行每行描述一個單詞,再之后的m行每行描述一段文章。 其中1<=n, m<=20,每個單詞長度不超過10,每段文章長度不超過1M。

Output

對于輸入的每一段文章,你需要輸出這段文章在字典D可以被理解的最長前綴的位置。

Sample Input

4 3
is
name
what
your
whatisyourname
whatisyouname
whaisyourname
 

Sample Output

14
6
0 整段文章’whatisyourname’都能被理解
前綴’whatis’能夠被理解
沒有任何前綴能夠被理解

 

HINT

 

Source

 

【DP】:

首先令f[i]表示到i的前綴能否被理解,那么答案就是f[i]==1時最大的i。
轉移也很簡單,如果f[i]==1,這個串就可以從i+1開始匹配一個新單詞。

f[i+1]|=f[i-len[pos[j]]+1];{f[0]=1;}

【算法】:

1、暴力trie+hash

2、Aho-Corasick Automata(AC自動機全名,我一定要打一遍)

這里我用的AC自動機。因為今天在練AC自動機

【實現】:

  把讀入的單詞建成一棵Trie樹,然后算匹配(可以不用Aho-Corasick,把Trie的查詢修改一下也能算),保留從每一個字符開始被匹配的單詞長度,然后挨著跑一遍,如果某個字符的前一個字符能夠到達,那就把這個字符加上其對應被匹配的長度的位置也標記為能夠到達,最后看最末尾的標記就是答案。

#include<cstdio>
#include<cstring>
#define Sz 26
#define m(s) memset(s,0,sizeof s);
using namespace std;
const int N=210,Z=26,M=1.1e6+5;
int n,m,cnt=1,tr[N][Z],fail[N],q[N],len[N],pos[N];
bool mark[N],f[M];char s[M];
void insert(int id){scanf("%s",s);int now=1,l=strlen(s);len[id]=l;for(int i=0,z;i<l;i++){z=s[i]-'a';if(!tr[now][z]) tr[now][z]=++cnt;now=tr[now][z];}pos[now]=id;
}
void acmach(){for(int i=0;i<Sz;i++) tr[0][i]=1;int h=0,t=1,now,p;q[t]=1;fail[1]=0;while(h!=t){now=q[++h];for(int i=0;i<Sz;i++){if(!tr[now][i]) continue;p=fail[now];while(!tr[p][i]) p=fail[p];p=tr[p][i];fail[tr[now][i]]=p;q[++t]=tr[now][i];}}
}
void solve(){//mark標記是為了對重復單詞只統計一次//而本題“文章”可能出現重復單詞;重復的單詞也可以進行轉移,故不能標mark m(f);/*m(mark);*/f[0]=1;scanf("%s",s);int now=1,l=strlen(s);for(int z,i=0;i<l;i++){z=s[i]-'a';
//        mark[now]=1;while(!tr[now][z]) now=fail[now];now=tr[now][z];
//        if(!mark[now]){for(int j=now;j;j=fail[j]){f[i+1]|=f[i-len[pos[j]]+1];}
//        }
    }for(int i=l;~i;i--) if(f[i]){printf("%d\n",i);break;}
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) insert(i);acmach();while(m--) solve();return 0;
}

?

轉載于:https://www.cnblogs.com/shenben/p/6548382.html

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

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

相關文章

對象的初始狀態(構造函數)

class Person(object):# name ""# age 0# height 0# weight 0def run(self):print("run")def eat(self,food):print("eat"food)def __init__(self,name,age,height,weight):# print(name,age,weight,height)print("這里是init")sel…

【bzoj 2434】【codevs 1946】[Noi2011]阿貍的打字機(AC自動機)

2434: [Noi2011]阿貍的打字機 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2477 Solved: 1382[Submit][Status][Discuss]Description 阿貍喜歡收藏各種稀奇古怪的東西&#xff0c;最近他淘到一臺老式的打字機。打字機上只有28個按鍵&#xff0c;分別印有26個小寫英文字母…

android加法服務類,iOS越來越像Android:蘋果簡單做加法遠離精致

原標題&#xff1a;iOS越來越像Android:蘋果簡單做加法遠離精致剛剛結束的WWDC2016的主題演講中&#xff0c;蘋果為我們帶來了最新的iOS 10系統&#xff0c;官方稱本次iOS 10的推出有著多大10項的重要更新&#xff0c;在用戶體驗、界面、Siri、地圖以及音樂方面都有著不少的變化…

JDK源碼學習之Arraylist與LinkedList

ArrayList和LinkedList是我們在開發過程中常用的兩種集合類&#xff0c;本文將從底層源碼實現對其進行簡單介紹。 下圖是Java集合類所涉及的類圖。 一.ArrayList 從上面的集合類圖可以看出&#xff0c;ArrayList實現了List接口。ArrayList是順序的集合容器,容器中可以存放null…

學習記錄4

學習了python基本數據類型&#xff0c;附學習筆記圖及操作圖 轉載于:https://www.cnblogs.com/bgd140206127/p/6549229.html

self 實例對象-代碼詳細解釋

self代表類的實例&#xff0c;而非類哪個對象調用方法&#xff0c;那么該方法中的self就代表那個對象self.__calss__ 代表類名class Person(object):def run(self):print("run")print(self.__class__)p self.__class__("tt",30,10,20)print(p)def eat(sel…

CString之GetBuffer與ReleaseBuffer

我們知道&#xff0c;CString是MFC中提供的方便字符串操作的一個類&#xff0c;非常好使&#xff0c;具有自動動態內存管理功能。 GetBuffer()主要作用是將字符串的緩沖區長度鎖定&#xff1b; ReleaseBuffer()則是解除對緩沖區的鎖定&#xff0c;這樣使得CString對象在以后的代…

mac 編譯android系統,mac 編譯 Android 系統雜記

掛載android分區sudo hdiutil attach ~/android_code/android7.dmg.sparseimage -mountpoint /Volumes/android原放入U盤&#xff1a;echo 188jinghao | sudo -S hdiutil attach ~/android7.dmg.sparseimage -mountpoint /Volumes/android放入機械硬盤sudo hdiutil attach /Vol…

Java開發必須熟悉的Linux命令總結

身為一個Java開發人員&#xff0c;這些常用的Linux命令必須掌握。即使平時開發過程中沒有使用Linux&#xff08;Unix&#xff09;或者mac系統&#xff0c;也需要熟練掌握Linux命令。因為很多服務器上都是Linux系統。所以&#xff0c;要和服務器機器交互&#xff0c;就要通過she…

構析函數

析構函數&#xff1a;__del__() 釋放對象時自動調用 class Person(object):def run(self):print("run")def eat(self,food):print("eat"food)def __init__(self,name,age,height,weight):self.name nameself.height heightself.age ageself.weight …

Java 序列化Serializable詳解(附詳細例子)

Java 序列化Serializable詳解&#xff08;附詳細例子&#xff09; 1、什么是序列化和反序列化Serialization&#xff08;序列化&#xff09;是一種將對象以一連串的字節描述的過程&#xff1b;反序列化deserialization是一種將這些字節重建成一個對象的過程。 2、什么情況下需要…

kettle-實現每個分組的前N的數據

2019獨角獸企業重金招聘Python工程師標準>>> 第一步&#xff1a;創建表及數據&#xff1a; create table uid(uid int, --uidcate varchar(20), --類別price double --金額 ) insert into uid values(123,c1,21); insert into uid values(123,c2,23); insert into u…

重寫__repr__與__str__函數

重寫&#xff1a;將函數重新定義寫一遍__str__():再調用print 打印對象時自動調用&#xff0c;是給用戶用的是一個描述對象的方法__repr__():是給機器用的&#xff0c;在python解釋器里面直接敲對象名再回車調用的方法注意&#xff1a;在沒有str時&#xff0c;且有repr,str re…

linux nexus 使用問題

2019獨角獸企業重金招聘Python工程師標準>>> 問題一&#xff0c;啟動提示設置RUN_AS_USERroot 但是&#xff0c;設置export或 /etc/profile未生效。 **************************************** WARNING - NOT RECOMMENDED TO RUN AS ROOT *************************…

項目回顧-PopupWindow

右上菜單&#xff0c;可以通過 重寫 onCreateOptionsMenu指定 menu&#xff0c; 重寫 onOptionsItemSelected 來響應點擊事件 不過 這個菜單在某些手機上彈出的有點卡頓&#xff0c;而且如果不對主題進行設置&#xff0c;會從actionbar 上直接彈出&#xff0c;而不是下面 如果想…

android listpreference 自定義,Android ListPreference的用法一

xmlns:android"http://schemas.android.com/apk/res/android"android:key"screen_list"android:title"標題"android:summary"說明摘要">< ListPreferenceandroid:key"myListPreference"android:title"標題"…

C語言求最大公約數和最小公倍數的幾種算法

求最小公倍數算法&#xff1a; 最小公倍數兩整數的乘積最大公約數 求最大公約數算法&#xff1a; (1)輾轉相除法 有兩整數a和b&#xff1a; ① a%b得余數c ② 若c0&#xff0c;則b即為兩數的最大公約數 ③ 若c≠0&#xff0c;則ab&#xff0c;bc&#xff0c;再回去執行①…

3月15日云棲精選夜讀:雙管齊下,MaxCompute數據上云與生態

雙管齊下&#xff0c;MaxCompute數據上云與生態 作者&#xff1a;場景研讀 Go語言并發機制初探 作者&#xff1a;邴越 趣拍云短視頻SDK全面升級&#xff0c;簡單易用引開發者點贊 作者&#xff1a;sherry是雪梨 發表在&#xff1a;趣拍云團隊 阿里云機器學習平臺編程模型演…

qt android glsl,基于Qt的OpenGL學習(1)—— Hello Triangle

簡介要學習OpenGL的話&#xff0c;強烈安利這個教程JoeyDeVries的learnopengl&#xff0c;這里是中文翻譯好的版本。教程中使用OpenGL是通過GLFW這個庫&#xff0c;而在Qt中對OpenGL封裝得很好&#xff0c;并且和GUI以及IO相關的處理Qt更便捷&#xff0c;學習起來更輕松。這里就…

解決:Not Found: /favicon.ico

直接說解決辦法&#xff1a; &#xff08;1&#xff09;制作一個 favicon.ico圖標放在<head></head>標簽中 <link rel"shortcut icon" href"xxxxxxxxxx.ico" type"image/x-icon" /> <!--制作的圖標&#xff0c;使用hr…