BZOJ1695 : [Usaco2007 Demo]Walk the Talk

博客分析了在特定条件下,长度为3和4的单词中,前两个字母相同的单词数量限制。通过预处理s1和s2数组,统计字母和单词出现次数,实现$O(26*26*nm)$的时间复杂度。最终解决方案的时间复杂度为$O(kn^2m^2)$,其中k不超过43。
摘要由CSDN通过智能技术生成

观察单词表可以发现:

对于长度为3的单词,前两个字母相同的单词不超过7个

对于长度为4的单词,前两个字母相同的单词不超过35个

 

于是首先$O(26*26*nm)$预处理出

s1[x][i][j]表示(i,j)右上角里面字母x的出现次数

s2[x][y][i][j]表示(i,j)右上角里面单词xy的出现次数

 

枚举一个点,计算长度为1的单词的出现次数

枚举两个点,计算长度为2,3,4的单词的出现次数

总时间复杂度为$O(kn^2m^2)$,k不超过43

 

#include<cstdio>
#include<string>
using namespace std;
const int N=35,M=2265,S=26;
int n,m,i,j,x,y,a[N][N],ans,v1[S],v2[S][S],s1[S][N][N],f[S][S][N][N],s2[S][S][N][N];
char ch[N];string d[M];
struct E{int x,y;E*nxt;}*g3[S][S],*g4[S][S],pool[M],*cur=pool,*p;
inline void add3(int a,int b,int x){p=cur++;p->x=x;p->nxt=g3[a][b];g3[a][b]=p;}
inline void add4(int a,int b,int x,int y){p=cur++;p->x=x;p->y=y;p->nxt=g4[a][b];g4[a][b]=p;}
int main(){
  d[0]="A";
  d[1]="AA";
  d[2]="AAA";
  d[3]="AAAA";
  d[4]="ABBE";
  d[5]="ABED";
  d[6]="ABET";
  d[7]="ABLE";
  d[8]="ABLY";
  d[9]="ABUT";
  d[10]="ACE";
  d[11]="ACES";
  d[12]="ACHE";
  d[13]="ACID";
  d[14]="ACME";
  d[15]="ACNE";
  d[16]="ACRE";
  d[17]="ACT";
  d[18]="AD";
  d[19]="ADD";
  d[20]="ADDS";
  d[21]="ADO";
  d[22]="ADS";
  d[23]="AFAR";
  d[24]="AFT";
  d[25]="AGAR";
  d[26]="AGE";
  d[27]="AGED";
  d[28]="AGER";
  d[29]="AGES";
  d[30]="AGO";
  d[31]="AGOG";
  d[32]="AGUE";
  d[33]="AH";
  d[34]="AID";
  d[35]="AIDE";
  d[36]="AIDS";
  d[37]="AIL";
  d[38]="AIM";
  d[39]="AIMS";
  d[40]="AIR";
  d[41]="AIRS";
  d[42]="AIRY";
  d[43]="AJAR";
  d[44]="AKIN";
  d[45]="ALAS";
  d[46]="ALBA";
  d[47]="ALE";
  d[48]="ALEE";
  d[49]="ALGA";
  d[50]="ALL";
  d[51]="ALLY";
  d[52]="ALMA";
  d[53]="ALMS";
  d[54]="ALOE";
  d[55]="ALSO";
  d[56]="ALUM";
  d[57]="AM";
  d[58]="AMEN";
  d[59]="AMID";
  d[60]="AMMO";
  d[61]="AMOK";
  d[62]="AMYL";
  d[63]="AN";
  d[64]="ANAL";
  d[65]="AND";
  d[66]="ANEW";
  d[67]="ANON";
  d[68]="ANT";
  d[69]="ANTE";
  d[70]="ANTI";
  d[71]="ANTS";
  d[72]="ANUS";
  d[73]="ANY";
  d[74]="APE";
  d[75]="APED";
  d[76]="APES";
  d[77]="APEX";
  d[78]="APSE";
  d[79]="APT";
  d[80]="AQUA";
  d[81]="ARC";
  d[82]="ARCH";
  d[83]="ARCS";
  d[84]="ARE";
  d[85]="AREA";
  d[86]="ARID";
  d[87]="ARK";
  d[88]="ARM";
  d[89]="ARMS";
  d[90]="ARMY";
  d[91]="ART";
  d[92]="ARTS";
  d[93]="AS";
  d[94]="ASH";
  d[95]="ASK";
  d[96]="ASKS";
  d[97]="ASP";
  d[98]="ASS";
  d[99]="AT";
  d[100]="ATE";
  d[101]="ATOM";
  d[102]="ATOP";
  d[103]="AUNT";
  d[104]="AURA";
  d[105]="AUTO";
  d[106]="AVER";
  d[107]="AVID";
  d[108]="AVOW";
  d[109]="AWAY";
  d[110]="AWE";
  d[111]="AWED";
  d[112]="AWL";
  d[113]="AWLS";
  d[114]="AWRY";
  d[115]="AX";
  d[116]="AXED";
  d[117]="AXER";
  d[118]="AXES";
  d[119]="AXIS";
  d[120]="AXLE";
  d[121]="AXON";
  d[122]="AYE";
  d[123]="AYES";
  d[124]="BABE";
  d[125]="BABY";
  d[126]="BACK";
  d[127]="BAD";
  d[128]="BADE";
  d[129]="BAG";
  d[130]="BAGS";
  d[131]="BAH";
  d[132]="BAIL";
  d[133]="BAIT";
  d[134]="BAKE";
  d[135]="BALD";
  d[136]="BALE";
  d[137]="BALK";
  d[138]="BALL";
  d[139]="BALM";
  d[140]="BAN";
  d[141]="BAND";
  d[142]="BANE";
  d[143]="BANG";
  d[144]="BANK";
  d[145]="BANS";
  d[146]="BAR";
  d[147]="BARB";
  d[148]="BARD";
  d[149]="BARE";
  d[150]="BARK";
  d[151]="BARN";
  d[152]="BARS";
  d[153]="BASE";
  d[154]="BASH";
  d[155]="BASK";
  d[156]="BASS";
  d[157]="BAT";
  d[158]="BATH";
  d[159]="BATS";
  d[160]="BAUD";
  d[161]="BAWL";
  d[162]="BAY";
  d[163]="BAYS";
  d[164]="BE";
  d[165]="BEAD";
  d[166]="BEAK";
  d[167]="BEAM";
  d[168]="BEAN";
  d[169]="BEAR";
  d[170]="BEAT";
  d[171]="BEAU";
  d[172]="BECK";
  d[173]="BED";
  d[174]="BEDS";
  d[175]="BEE";
  d[176]="BEEF";
  d[177]="BEEN";
  d[178]="BEEP";
  d[179]="BEER";
  d[180]="BEES";
  d[181]="BEET";
  d[182]="BEG";
  d[183]="BEGS";
  d[184]="BELL";
  d[185]="BELT";
  d[186]="BELY";
  d[187]="BEND";
  d[188]="BENT";
  d[189]="BEST";
  d[190]="BET";
  d[191]="BETA";
  d[192]="BETS";
  d[193]="BEVY";
  d[194]="BIAS";
  d[195]="BIB";
  d[196]="BIBS";
  d[197]="BID";
  d[198]="BIDE";
  d[199]="BIDS";
  d[200]="BIER";
  d[201]="BIG";
  d[202]="BIKE";
  d[203]="BILE";
  d[204]="BILK";
  d[205]="BILL";
  d[206]="BIN";
  d[207]="BIND";
  d[208]="BING";
  d[209]="BINS";
  d[210]="BIRD";
  d[211]="BIT";
  d[212]="BITE";
  d[213]="BITS";
  d[214]="BLAB";
  d[215]="BLED";
  d[216]="BLEW";
  d[217]="BLIP";
  d[218]="BLOB";
  d[219]="BLOC";
  d[220]="BLOT";
  d[221]="BLOW";
  d[222]="BLUE";
  d[223]="BLUR";
  d[224]="BOA";
  d[225]="BOAR";
  d[226]="BOAT";
  d[227]="BOB";
  d[228]="BOBS";
  d[229]="BODE";
  d[230]="BODY";
  d[231]="BOG";
  d[232]="BOGS";
  d[233]="BOIL";
  d[234]="BOLD";
  d[235]="BOLL";
  d[236]="BOLT";
  d[237]="BOMB";
  d[238]="BOND";
  d[239]="BONE";
  d[240]="BONG";
  d[241]="BONY";
  d[242]="BOO";
  d[243]="BOOB";
  d[244]="BOOK";
  d[245]="BOOM";
  d[246]="BOON";
  d[247]="BOOR";
  d[248]="BOOS";
  d[249]="BOOT";
  d[250]="BORE";
  d[251]="BORN";
  d[252]="BOSS";
  d[253]="BOTH";
  d[254]="BOUT";
  d[255]="BOW";
  d[256]="BOWL";
  d[257]="BOWS";
  d[258]="BOX";
  d[259]="BOY";
  d[260]="BOYS";
  d[261]="BRA";
  d[262]="BRAE";
  d[263]="BRAG";
  d[264]="BRAN";
  d[265]="BRAS";
  d[266]="BRAT";
  d[267]="BRAY";
  d[268]="BRED";
  d[269]="BREW";
  d[270]="BRIG";
  d[271]="BRIM";
  d[272]="BROW";
  d[273]="BUCK";
  d[274]="BUD";
  d[275]="BUDS";
  d[276]="BUFF";
  d[277]="BUG";
  d[278]="BUGS";
  d[279]="BULB";
  d[280]="BULK";
  d[281]="BULL";
  d[282]="BUM";
  d[283]="BUMP";
  d[284]="BUMS";
  d[285]="BUN";
  d[286]="BUNK";
  d[287]="BUNS";
  d[288]="BUNT";
  d[289]="BUOY";
  d[290]="BURL";
  d[291]="BURN";
  d[292]="BURP";
  d[293]="BURY";
  d[294]="BUS";
  d[295]="BUSH";
  d[296]="BUSS";
  d[297]="BUST";
  d[298]="BUSY";
  d[299]="BUT";
  d[300]="BUTT";
  d[301]="BUY";
  d[302]="BUYS";
  d[303]="BUZZ";
  d[304]="BY";
  d[305]="BYE";
  d[306]="BYTE";
  d[307]="CAB";
  d[308]="CABS";
  d[309]="CAFE";
  d[310]="CAGE";
  d[311]="CAKE";
  d[312]="CALF";
  d[313]="CALL";
  d[314]="CALM";
  d[315]="CAM";
  d[316]="CAME";
  d[317]="CAMP";
  d[318]="CAN";
  d[319]="CANE";
  d[320]="CANS";
  d[321]="CANT";
  d[322]="CAP";
  d[323]="CAPE";
  d[324]="CAPS";
  d[325]="CAR";
  d[326]="CARD";
  d[327]="CARE";
  d[328]="CARP";
  d[329]="CARS";
  d[330]="CART";
  d[331]="CASE";
  d[332]="CASH";
  d[333]="CASK";
  d[334]="CAST";
  d[335]="CAT";
  d[336]="CATS";
  d[337]="CAVE";
  d[338]="CAW";
  d[339]="CEDE";
  d[340]="CELL";
  d[341]="CENT";
  d[342]="CHAP";
  d[343]="CHAR";
  d[344]="CHAT";
  d[345]="CHEF";
  d[346]="CHEW";
  d[347]="CHIC";
  d[348]="CHIN";
  d[349]="CHIP";
  d[350]="CHIT";
  d[351]="CHOP";
  d[352]="CHUM";
  d[353]="CITE";
  d[354]="CITY";
  d[355]="CLAD";
  d[356]="CLAM";
  d[357]="CLAN";
  d[358]="CLAP";
  d[359]="CLAW";
  d[360]="CLAY";
  d[361]="CLIP";
  d[362]="CLOD";
  d[363]="CLOG";
  d[364]="CLOT";
  d[365]="CLUB";
  d[366]="CLUE";
  d[367]="COAL";
  d[368]="COAT";
  d[369]="COAX";
  d[370]="COCA";
  d[371]="COCK";
  d[372]="COCO";
  d[373]="COD";
  d[374]="CODE";
  d[375]="COED";
  d[376]="COG";
  d[377]="COGS";
  d[378]="COIL";
  d[379]="COIN";
  d[380]="COKE";
  d[381]="COLD";
  d[382]="COLT";
  d[383]="COMB";
  d[384]="COME";
  d[385]="CON";
  d[386]="CONE";
  d[387]="COO";
  d[388]="COOK";
  d[389]="COOL";
  d[390]="COON";
  d[391]="COOP";
  d[392]="COP";
  d[393]="COPE";
  d[394]="COPS";
  d[395]="COPY";
  d[396]="CORD";
  d[397]="CORE";
  d[398]="CORK";
  d[399]="CORN";
  d[400]="COST";
  d[401]="COSY";
  d[402]="COT";
  d[403]="COTS";
  d[404]="COVE";
  d[405]="COW";
  d[406]="COWL";
  d[407]="COWS";
  d[408]="COZY";
  d[409]="CRAB";
  d[410]="CRAG";
  d[411]="CRAM";
  d[412]="CREW";
  d[413]="CRIB";
  d[414]="CROP";
  d[415]="CROW";
  d[416]="CRUD";
  d[417]="CRUX";
  d[418]="CRY";
  d[419]="CUB";
  d[420]="CUBE";
  d[421]="CUBS";
  d[422]="CUE";
  d[423]="CUED";
  d[424]="CUES";
  d[425]="CUFF";
  d[426]="CULL";
  d[427]="CULT";
  d[428]="CUP";
  d[429]="CUPS";
  d[430]="CURB";
  d[431]="CURD";
  d[432]="CURE";
  d[433]="CURL";
  d[434]="CURS";
  d[435]="CURT";
  d[436]="CUSP";
  d[437]="CUT";
  d[438]="CUTE";
  d[439]="CUTS";
  d[440]="CYST";
  d[441]="CZAR";
  d[442]="DAD";
  d[443]="DADS";
  d[444]="DALE";
  d[445]="DAM";
  d[446]="DA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值