BZOJ 1695 [Usaco2007 Demo]Walk the Talk 链表+数学

来源:互联网 发布:浪潮java面试题 编辑:程序博客网 时间:2024/06/08 00:54

题意:链接

方法:乱搞

解析:

出这道题的人存心报复社会。

首先这个单词表…先上网上找这个单词表…

反正总共2265个单词,然后就考虑怎么做就行了。

刚开始我没看表,找不到怎么做,最快的方法我也只是想到了类n^6的做法。

然后我就卡关辣,这关怎么过!

神犇的方法是:观察表,发现规律:

发现表中的单词最长就是4个字母。

所以我们可以考虑求1,2,3,4长度的单词数。

1的话可以直接记录,扫的时候顺带加上就行。

然后神犇说了一句话:

表中长度为4的单词前两个字母相同的单词个数不超过35个。

长度为3前一个字母相同的单词个数不超过7个。

所以直接上链表优化啊?

这样的话就要求我们预处理什么呢?

预处理点(i,j)右上角字母x的出现次数。

预处理点(i,j)右上角后缀xy的出现次数。

这个怎么维护啊?

容斥原理啊,所以复杂度在26*26*nm左右,也就是4次方,可以接受。

所以我们只需要枚举开头的两个字母,这是n^4的复杂度,然后再加上链表,枚举次数不超过43=(35+7),而提取个数因为我们的预处理,变成辣O1啊,所以这样的话总共的复杂度是在n^5的!

掉了一个n啊!这不就能过了吗!

orz出题人。

单词表:

AAAAAAAAAAABBEABEDABETABLEABLYABUTACEACESACHEACIDACMEACNEACREACTADADDADDSADOADSAFARAFTAGARAGEAGEDAGERAGESAGOAGOGAGUEAHAIDAIDEAIDSAILAIMAIMSAIRAIRSAIRYAJARAKINALASALBAALEALEEALGAALLALLYALMAALMSALOEALSOALUMAMAMENAMIDAMMOAMOKAMYLANANALANDANEWANONANTANTEANTIANTSANUSANYAPEAPEDAPESAPEXAPSEAPTAQUAARCARCHARCSAREAREAARIDARKARMARMSARMYARTARTSASASHASKASKSASPASSATATEATOMATOPAUNTAURAAUTOAVERAVIDAVOWAWAYAWEAWEDAWLAWLSAWRYAXAXEDAXERAXESAXISAXLEAXONAYEAYESBABEBABYBACKBADBADEBAGBAGSBAHBAILBAITBAKEBALDBALEBALKBALLBALMBANBANDBANEBANGBANKBANSBARBARBBARDBAREBARKBARNBARSBASEBASHBASKBASSBATBATHBATSBAUDBAWLBAYBAYSBEBEADBEAKBEAMBEANBEARBEATBEAUBECKBEDBEDSBEEBEEFBEENBEEPBEERBEESBEETBEGBEGSBELLBELTBELYBENDBENTBESTBETBETABETSBEVYBIASBIBBIBSBIDBIDEBIDSBIERBIGBIKEBILEBILKBILLBINBINDBINGBINSBIRDBITBITEBITSBLABBLEDBLEWBLIPBLOBBLOCBLOTBLOWBLUEBLURBOABOARBOATBOBBOBSBODEBODYBOGBOGSBOILBOLDBOLLBOLTBOMBBONDBONEBONGBONYBOOBOOBBOOKBOOMBOONBOORBOOSBOOTBOREBORNBOSSBOTHBOUTBOWBOWLBOWSBOXBOYBOYSBRABRAEBRAGBRANBRASBRATBRAYBREDBREWBRIGBRIMBROWBUCKBUDBUDSBUFFBUGBUGSBULBBULKBULLBUMBUMPBUMSBUNBUNKBUNSBUNTBUOYBURLBURNBURPBURYBUSBUSHBUSSBUSTBUSYBUTBUTTBUYBUYSBUZZBYBYEBYTECABCABSCAFECAGECAKECALFCALLCALMCAMCAMECAMPCANCANECANSCANTCAPCAPECAPSCARCARDCARECARPCARSCARTCASECASHCASKCASTCATCATSCAVECAWCEDECELLCENTCHAPCHARCHATCHEFCHEWCHICCHINCHIPCHITCHOPCHUMCITECITYCLADCLAMCLANCLAPCLAWCLAYCLIPCLODCLOGCLOTCLUBCLUECOALCOATCOAXCOCACOCKCOCOCODCODECOEDCOGCOGSCOILCOINCOKECOLDCOLTCOMBCOMECONCONECOOCOOKCOOLCOONCOOPCOPCOPECOPSCOPYCORDCORECORKCORNCOSTCOSYCOTCOTSCOVECOWCOWLCOWSCOZYCRABCRAGCRAMCREWCRIBCROPCROWCRUDCRUXCRYCUBCUBECUBSCUECUEDCUESCUFFCULLCULTCUPCUPSCURBCURDCURECURLCURSCURTCUSPCUTCUTECUTSCYSTCZARDADDADSDALEDAMDAMEDAMNDAMPDAMSDAREDARKDARNDARTDASHDATADATEDAWNDAYDAYSDAZEDEADDEAFDEALDEANDEARDEBTDECKDEEDDEEMDEEPDEERDEFYDELLDEMODENDENSDENTDENYDESKDEUSDEWDEWYDIALDICEDIDDIEDIEDDIEMDIESDIETDIGDIGSDIKEDILLDIMDIMEDIMSDINDINEDINGDINTDIPDIPSDIREDIRTDISCDISHDISKDIVEDODOCKDOEDOERDOESDOGDOGSDOLEDOLLDOMEDONDONEDONSDOOMDOORDOPEDOSEDOTDOTEDOTSDOVEDOWNDOZEDRABDRAGDRAMDRAWDREWDRIPDROPDRUGDRUMDRYDUALDUBDUBSDUCKDUCTDUDDUEDUELDUESDUETDUGDUKEDULLDULYDUMBDUMPDUNEDUNGDUNKDUPEDUSKDUSTDUTYDYADDYEDYEDDYERDYESDYNEEACHEAREARLEARNEARSEASEEASTEASYEATEATSEBBEBBSECHOEDDYEDGEEDITEELEELSEGGEGGSEGOEGOSEKEEKEDEKESELFELKELKSELMELMSELSEEMEMITENENDENDSENVYEPICERAERASEREERGERGOERRERRSESPYETETCHEVENEVEREVILEWEEWESEXEXAMEXECEXITEYEEYEDEYEREYESFACEFACTFADEFAGFAGSFAILFAINFAIRFAKEFALLFAMEFANFANGFANSFARFAREFARMFASTFATFATEFATSFAUNFAWNFAZEFEARFEATFEDFEEFEEDFEELFEESFEETFELLFELTFENFENDFERNFEUDFEWFIATFIBFIEFFIFEFIGFIGSFILEFILLFILMFINFINDFINEFINKFINSFIRFIREFIRMFISHFISTFITFITSFIVEFIXFLAGFLAKFLAMFLAPFLATFLAWFLAXFLEAFLEDFLEEFLEWFLEXFLIPFLITFLOGFLOPFLOWFLUFLUEFLUXFLYFOALFOAMFOBFOCIFOEFOESFOGFOGSFOGYFOILFOLDFOLKFONDFONTFOODFOOLFOOTFORFORDFOREFORKFORMFORTFOULFOURFOWLFOXFRAYFREEFRETFROFROGFROMFRYFUELFULLFUMEFUNFUNDFUNKFURFURSFURYFUSEFUSSFUZZGABGADGAGGAGSGAINGAITGALEGALLGAMEGANGGAPGAPEGAPSGARBGASGASHGASPGATEGAVEGAWKGAYGAZEGEARGELGELDGELSGEMGEMSGENEGENTGERMGETGETSGIFTGIGGILDGILLGILTGINGINSGIRDGIRLGIRTGISTGIVEGLADGLEEGLENGLOWGLUEGLUTGNATGNAWGNUGOGOADGOALGOATGODGODSGOESGOLDGOLFGONEGONGGOODGOOFGOREGORYGOSHGOTGOUTGOWNGRABGRADGRAMGRAYGREWGREYGRIDGRIMGRINGRIPGRITGROWGRUBGULFGULLGULPGUMGUMSGUNGUNSGURUGUSHGUSTGUTGUTSGUYGUYSGYROHAHACKHADHAGHAILHAIRHALEHALFHALLHALTHAMHAMSHANDHANGHAPHARDHAREHARKHARMHARPHARTHASHASHHATHATEHATSHAULHAVEHAWKHAYHAZEHAZYHEHEADHEALHEAPHEARHEATHECKHEEDHEELHEIRHELDHELLHELMHELPHEMHEMPHEMSHENHENSHERHERBHERDHEREHEROHERSHEWHEWSHEXHEYHIHICKHIDHIDEHIGHHIKEHILLHILTHIMHINDHINTHIPHIPSHIREHISHISSHITHITSHIVEHOARHOEHOESHOGHOGSHOLDHOLEHOLYHOMEHOMOHONEHOODHOOFHOOKHOOPHOOTHOPHOPEHOPSHORNHOSEHOSTHOTHOURHOWHOWLHUBHUBSHUEHUESHUGHUGEHUHHULLHUMHUMPHUMSHUNGHUNKHUNTHURLHURTHUSHHUSKHUTHUTSHYMNIBEXIBIDIBISICEICEDICESICONICYIDEAIDEMIDLEIDLYIDOLIFILLILLSILLYIMPIMPSININCHINKINKSINNINNSINTOIONIONSIOTAIREIRESIRISIRKIRKSIRONISISLEITITCHITEMITSIVYJABJABSJACKJADEJAILJAMJAMSJARJARSJAWJAWSJAYJAZZJEANJEEPJEERJERKJESTJETJETSJIGJIGSJOBJOBSJOGJOGSJOINJOKEJOLTJOTJOTSJOYJOYSJUDOJUGJUGSJUMPJUNKJUREJURYJUSTJUTKEELKEENKEEPKENKEPTKERNKEYKEYSKICKKIDKIDSKILLKINKINDKINGKINKKISSKITKITEKITSKNEEKNEWKNITKNOBKNOTKNOWKUDOLABLABSLACELACKLACYLADLADSLADYLAGLAGSLAIDLAINLAIRLAKELAMBLAMELAMPLANDLANELAPLAPSLARDLARKLASHLASSLASTLATELAVALAWLAWNLAWSLAXLAYLAYSLAZYLEADLEAFLEAKLEANLEAPLEDLEELEEKLEERLEESLEFTLEGLEGSLENDLENSLENTLESSLESTLETLETSLEVYLEWDLIARLICELICKLIDLIDSLIELIEDLIENLIESLIEULIFELIFTLIKELILYLIMBLIMELIMPLINELINKLINTLIONLIPLIPSLISPLISTLITLIVELOADLOAFLOANLOBELOCILOCKLOFTLOGOLOGSLOINLONELONGLOOKLOOMLOONLOOPLOOTLORDLORELOSELOSSLOSTLOTLOTSLOUDLOUTLOVELOWLOWSLUCKLULLLUMPLUNGLURELURKLUSHLUSTLUTELYNXLYREMACEMADMADEMAIDMAILMAIMMAINMAKEMALEMALLMALTMAMAMANMANEMANYMAPMAPSMAREMARKMARTMASHMASKMASSMASTMATMATEMATHMATSMAULMAZEMEMEADMEALMEANMEATMEEKMEETMELTMEMOMENMENDMENSMENUMEREMESHMESSMETMETAMETEMETSMEWMEWSMICAMICEMIDMIENMIKEMILDMILEMILKMILLMINDMINEMINIMINKMINTMIREMISSMISTMIXMOANMOATMOBMOBSMOCKMODEMOLDMOLEMONKMOOMOODMOOTMOPMOPSMOREMORNMOSSMOSTMOTHMOVEMOWMOWSMUMUCHMUCKMUDMUFFMUGMUGSMULEMULLMUNGMUSEMUSHMUSKMUSTMUTEMUTTMYMYTHNABNAGNAGSNAILNAMENAPNAPSNARYNAVYNAYNEARNEATNECKNEEDNEONNESTNETNETSNEWNEWTNEXTNICENICKNIGHNILNINENIPNIPSNONODNODENODSNONNONENOOKNOONNORNORMNOSENOTNOTENOUNNOWNUNUDENULLNUMBNUNNUNSNUTNUTSOAFOAKOAKSOAROARSOATOATHOATSOBEYOBOEODDODDSODEODESODOROFOFFOFFSOFTOHOHMOILOILSOILYOKAYOLDOLDYOMENOMITONONCEONEONESONLYONTOONUSONYXOOZEOPALOPENOPTOPTSOPUSORORALORBOREORESORGYOUCHOUROURSOUSTOUTOUTSOVALOVENOVEROWEOWEDOWESOWLOWLSOWNOWNSOXOXENPACEPACKPACTPADPADSPAGEPAIDPAILPAINPAIRPALPALEPALLPALMPALSPANPANEPANGPANSPANTPAPAPARPAREPARKPARSPARTPASSPASTPATPATEPATHPATSPAVEPAWPAWNPAWSPAYPAYSPEAPEAKPEALPEARPEASPEATPECKPEEKPEELPEEPPEERPEGPEGSPELTPENPENDPENSPENTPEPPERPERKPESTPETPETSPEWPEWSPHIPIPICAPICKPIEPIERPIESPIGPIGSPIKEPILEPILLPIMPPINPINEPINGPINKPINSPINTPIONPIPPIPEPISSPITPITHPITSPITYPLANPLAYPLEAPLODPLOTPLOWPLOYPLUGPLUMPLUSPLYPODPODSPOEMPOETPOGOPOKEPOLEPOLLPOLOPOMPPONDPONGPONYPOOLPOORPOPPOPSPOREPORKPORTPOSEPOSHPOSTPOTPOTSPOURPOUTPOXPRAYPREPPREYPRIMPROPRODPROPPROSPROWPRYPUBPUBSPUFFPUKEPULLPULPPUMAPUMPPUNPUNSPUNTPUNYPUPPUPAPUPSPUREPURRPUSPUSHPUSSPUTPUTSPUTTPYREQUAQUADQUAYQUIPQUITQUIZQUORACERACKRAFTRAGRAGERAGSRAIDRAILRAINRAKERAMRAMPRAMSRANRANGRANKRANTRAPRAPERAPSRAPTRARERASHRASPRATRATERATSRAVERAWRAYRAYSRAZEREREADREALREAMREAPREARREDREDOREDSREEDREEFREELREINRELYRENDRENTRESTRHORIBRIBSRICERICHRIDRIDERIDSRIFTRIGRIGSRILLRIMRIMERIMSRINDRINGRINKRIOTRIPRIPERIPSRISERISKRITEROADROAMROARROBROBEROBSROCKRODRODERODSROEROLEROLLROMPROOFROOKROOMROOTROPEROSYROTROTSROUTROVEROWROWSRUBRUBSRUBYRUDERUERUGRUGSRUINRULERUMRUMPRUNRUNGRUNSRUNTRUSHRUSTRUTRUTSRYESACKSADSAFESAGSAGASAGESAGSSAIDSAILSAKESALESALTSAMESANDSANESANGSANKSAPSAPSSARISASHSATSATESAVESAWSAWSSAXSAYSAYSSCABSCANSCARSCOWSCUDSEASEALSEAMSEARSEASSEATSECTSEESEEDSEEKSEEMSEENSEEPSEERSEESSELFSELLSEMISENDSENTSEPTSERFSETSETSSEWSEWSSEXSEXYSHAMSHESHEDSHINSHIPSHITSHODSHOESHOPSHOTSHOWSHUNSHUTSHYSICKSIDESIFTSIGHSIGNSILKSILLSILOSILTSINESINGSINKSINSSIPSIPSSIRSIRESIRSSITSITESITSSITUSIXSIZESKEWSKISKIDSKIMSKINSKIPSKISSKITSKYSLABSLAMSLAPSLATSLAYSLEDSLEWSLIDSLIMSLIPSLITSLOBSLOPSLOTSLOWSLUGSLUMSLURSLYSMOGSMUGSMUTSNAGSNAPSNIPSNOBSNOWSNUBSNUGSOSOAKSOAPSOARSOBSOBSSOCKSODSODASODSSOFASOFTSOILSOLDSOLESOLOSOMESONSONGSONSSOONSOOTSORESORTSOULSOUPSOURSOWSOWNSOYSOYASPASPANSPATSPECSPEDSPINSPITSPOTSPUNSPURSPYSTABSTAGSTARSTAYSTEMSTEPSTEWSTIRSTOPSTOWSTUBSTUDSTUNSUBSUBSSUCHSUCKSUDSSUESUEDSUESSUITSULKSUMSUMSSUNSUNGSUNKSUNSSURESURFSWABSWAMSWANSWAPSWATSWAYSWIMSWUMTABTABSTACKTACTTAGTAGSTAILTAKETALETALKTALLTAMETANTANGTANKTAPTAPETAPSTARTARTTASKTAUTAUTTAXTAXITEATEAMTEARTEASTEEMTEENTELLTENTENDTENSTENTTERMTESTTEXTTHANTHATTHAWTHETHEMTHENTHEYTHINTHISTHUDTHUGTHUSTICKTIDETIDYTIETIEDTIERTIESTILETILLTILTTIMETINTINSTINTTINYTIPTIPSTIRETITTITSTOTOADTOETOESTOILTOLDTOLLTOMBTONTONETONSTOOTOOKTOOLTOPTOPSTORETORNTOSSTOURTOWTOWNTOYTOYSTRAPTRAYTREETREKTRIMTRIOTRIPTRODTROTTRUETRYTUBTUBETUBSTUCKTUFTTUGTUGSTUNETURFTURNTWASTWIGTWINTWOTWOSTYPETYPOUGHUGLYUNDOUNITUNTOUPUPONURGEURNURNSUSUSEUSEDUSERUSESVAINVALEVANVANEVANSVARYVASEVASTVATVATSVEALVEERVEILVEINVENTVERBVERYVESTVETOVEXVIAVIALVICEVIEVIEDVIERVIESVIEWVILEVINEVISAVITAVOIDVOLTVOTEVOWVOWSWADEWAFTWAGWAGEWAGSWAILWAITWAKEWALKWALLWANWANDWANEWANTWARWARDWAREWARMWARNWARPWARSWARTWARYWASWASHWASPWAVEWAXWAXYWAYWAYSWEWEAKWEANWEARWEBWEBSWEDSWEEWEEDWEEKWEEPWELDWELLWENTWEPTWEREWESTWETWETSWHATWHENWHIMWHIPWHITWHIZWHOWHOMWHYWICKWIDEWIFEWIGWIGSWILDWILEWILLWILTWILYWINWINDWINEWINGWINKWINSWIPEWIREWIRYWISEWISHWISPWITWITHWITSWOEWOKEWOLFWOMBWONWONTWOOWOODWOOFWOOLWOOSWORDWOREWORKWORMWORNWOVEWRAPWRENWRITYANKYARDYARNYAWNYEAYEARYEASYELLYELPYESYETYOKEYONYOUYOURZEALZEROZESTZINCZONEZOOZOOMZOOS

代码:(因单词表在上方给出,所以此处略)

#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#define N 35using namespace std;string d[2265];int map[N][N];int sum1[N][N][N];int sum2[N][N][N][N];int fuck[N][N][N][N];int head[N][N];int head2[N][N];int v[N];int v1[N][N];int cnt,cnt2;int n,m;struct node{    int fromx,fromy,x,y,next;}edge[2265],edge2[2265];void init(){    memset(head,-1,sizeof(head));    memset(head2,-1,sizeof(head2));    cnt=1,cnt2=1;}void edgeadd(int fromx,int fromy,int to){    edge[cnt].fromx=fromx,edge[cnt].fromy=fromy;    edge[cnt].x=to;    edge[cnt].next=head[fromx][fromy];    head[fromx][fromy]=cnt++;}void edgeadd2(int fromx,int fromy,int to,int to2){    edge2[cnt2].fromx=fromx,edge2[cnt2].fromy=fromy;    edge2[cnt2].x=to,edge2[cnt2].y=to2;    edge2[cnt2].next=head2[fromx][fromy];    head2[fromx][fromy]=cnt2++;}char s[N];int main(){    //此处放单词表,多背单词少刷水!!!!!!!!!!!!!!!!    init();    for(int i=0;i<=2264;i++)    {        int len=d[i].size();        switch(len)        {            case 1:v[d[i][0]-'A']=1;break;            case 2:v1[d[i][0]-'A'][d[i][1]-'A']=1;break;            case 3:edgeadd(d[i][0]-'A',d[i][1]-'A',d[i][2]-'A');break;            case 4:edgeadd2(d[i][0]-'A',d[i][1]-'A',d[i][2]-'A',d[i][3]-'A');break;        }    }    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%s",s+1);        for(int j=1;j<=m;j++)        {            map[i][j]=s[j]-'A';        }    }    for(int i=0;i<26;i++)    {        for(int j=1;j<=n;j++)        {            for(int k=m;k>=1;k--)            {                sum1[i][j][k]=sum1[i][j-1][k]+sum1[i][j][k+1]-sum1[i][j-1][k+1]+(map[j][k]==i);                fuck[map[j][k]][i][j][k]=sum1[i][j][k]-(map[j][k]==i);            }        }    }    for(int i=0;i<26;i++)    {        for(int j=0;j<26;j++)        {            for(int k=1;k<=n;k++)            {                for(int l=m;l>=1;l--)                {                    sum2[i][j][k][l]=sum2[i][j][k-1][l]+sum2[i][j][k][l+1]-sum2[i][j][k-1][l+1]+fuck[i][j][k][l];                }            }        }    }    int ans=0;    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(v[map[i][j]])ans++;            for(int x=i;x>=1;x--)            {                for(int y=j;y<=m;y++)                {                    if(x==i&&y==j)continue;                    if(v1[map[i][j]][map[x][y]])ans++;                    for(int k=head[map[i][j]][map[x][y]];k!=-1;k=edge[k].next)                    {                        int to=edge[k].x;                        ans+=sum1[to][x][y]-(map[x][y]==to);                    }                    for(int k=head2[map[i][j]][map[x][y]];k!=-1;k=edge2[k].next)                    {                        int to=edge2[k].x;                        int to2=edge2[k].y;                        ans+=sum2[to][to2][x][y]-fuck[to][to2][x][y];                    }                }            }        }    }    printf("%d\n",ans);}
0 0
原创粉丝点击