今天打模拟赛,又爆零啦,t2想了好久,自己以为是O(18*n),结果直接T炸,t1看了看数据范围,觉得强扫一遍可能会T,然后想了想,打了个二分,结果正解是暴力(都是你想太多),然鹅居然二分还是打炸了,mmp(爆零选手),t3看了看是缩点,结果隔壁蓝姐(傻子)告诉我,肯定没有这么难的啦,结果我就没缩,只记录了出度为零和入度为零的,然后就gg了(其实还是自己傻),然后正解出来缩点emmm,t4看了一眼,dp啊,时间一维站点二维,dp一下,就odk了,结果时间到了(以为十二点结果十一点半emmm)(其实还是前两题自己傻没调好时间),然后就很光荣的爆零了。以下为t2两百行代码,我也不知道是什么错,查询数量可以对,但是最后的输出就炸了。
题目:对于一段文本,要求写出一段程序,完成查找与替换
输入描述:第一行包括若干个单词(单词长度 <=200,单词数<=1000),两两之间用空格隔开。
接下来为若干行,每行代表一个操作(操作数小于<=1000)。首先是一个整数x。
如果x=0,表示查找操作。在这一行的后面有一个单词w,你需要输出文本中单词w出现的次数。如果x=1,表示替换操作。在这一行后面有两个空格隔开的单词w1和w2,要求将文本中所有的单词w1替换成w2。
输出描述:对于每个查找操作,输出文本中单词w出现的次数。
最后一行输出现在的文本。
WA代码(查询没错,但最后的输出错了)
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<map> 6 #include<set> 7 #include<queue> 8 #include<cmath> 9 #include<cctype> 10 using namespace std; 11 12 13 #define INF 0x3f3f3f3f 14 #define REP(i,a,b) for(int i=a;i<=b;++i) 15 #define CL(a,b) memset(a,b,sizeof(a)) 16 #define lint long long 17 #define N 15 18 19 //#define getchar() (FS==FT&&(FT=(FS=BB)+fread(BB,1,1<<15,stdin),FS==FT)?EOF:*FS++) 20 char *FS,*FT,BB[1<<15]; 21 22 23 24 25 struct node{ 26 char S[205]; 27 int q; 28 bool operator <(const node &a)const{return strcmp(S,a.S)<0;} 29 }E[1005],C[1005]; 30 31 32 int sum; 33 void init(){ 34 char ch; 35 int l; 36 ch=getchar(); 37 while(ch!='\n'){ 38 l=0; 39 while(!isalnum(ch)){ 40 ch=getchar(); 41 if(ch=='\n')return; 42 } 43 sum++; 44 while(isalnum(ch)){ 45 E[sum].S[l++]=ch; 46 ch=getchar(); 47 } 48 E[sum].q=sum; 49 } 50 } 51 52 char query[205],chan[205]; 53 54 int Q(char *S){ 55 int l=1,r=sum,cur=0; 56 while(l<=r){ 57 int mid=(l+r)>>1; 58 // printf("%s\n",S); 59 if(strcmp(S,E[mid].S)<=0){ 60 r=mid-1; 61 } 62 else l=mid+1; 63 // printf("???"); 64 } 65 while(!strcmp(S,E[l].S)){ 66 cur++; 67 l++; 68 } 69 return cur; 70 } 71 72 int FQ(char *S,int &x){ 73 int l=1,r=sum,cur=0; 74 while(l<=r){ 75 int mid=(l+r)>>1; 76 if(strcmp(S,E[mid].S)<=0){ 77 r=mid-1; 78 } 79 else l=mid+1; 80 } 81 x=l; 82 while(!strcmp(S,E[l].S)){ 83 cur++; 84 l++; 85 } 86 return cur; 87 } 88 89 void MMP(char *q,char *c){ 90 int i=strcmp(q,c); 91 if(i==0)return; 92 int cf=0,cnm=0; 93 if(i<0){ 94 int q_lef,c_lef; 95 int q_len=FQ(q,q_lef); 96 int c_len=FQ(c,c_lef); 97 // printf("q_lef:%d c_lef:%d\n",q_lef,c_lef); 98 REP(p,q_len+q_lef,c_lef-1){ 99 C[++cf]=E[p]; 100 } 101 REP(j,c_lef-q_len,c_lef-1){ 102 strcpy(E[j].S,c); 103 // printf("emmm\n"); 104 E[j].q=E[q_lef+cnm].q; 105 cnm++; 106 } 107 REP(q,1,cf){ 108 E[q_lef+q-1]=C[q]; 109 } 110 } 111 else{ 112 int q_lef,c_lef; 113 int q_len=FQ(q,q_lef); 114 int c_len=FQ(c,c_lef); 115 // printf("q_lef:%d c_lef:%d\n",q_lef,c_lef); 116 REP(p,c_len+c_lef,q_lef-1){ 117 C[++cf]=E[p]; 118 } 119 REP(j,1,q_len){ 120 strcpy(E[c_len+c_lef+j-1].S,c); 121 E[c_len+c_lef+j-1].q=E[q_lef-1+j].q; 122 } 123 REP(j,c_lef+c_len+q_len,q_len+q_lef-1){ 124 E[j]=C[++cnm]; 125 } 126 } 127 // REP(i,1,sum){ 128 // printf("%s ",E[i].S); 129 // } 130 // printf("\n"); 131 } 132 bool cmp(node a,node b){ 133 return a.q<b.q; 134 } 135 136 void P(){ 137 sort(E+1,E+1+sum,cmp); 138 REP(i,1,sum){ 139 printf("%s ",E[i].S); 140 } 141 } 142 143 void get(char *s){ 144 char ch; 145 int l=0; 146 ch=getchar(); 147 while(!isalnum(ch)){ 148 if(ch==-1){ 149 P(); 150 exit(0); 151 } 152 ch=getchar(); 153 } 154 while(isalnum(ch)){ 155 s[l++]=ch; 156 ch=getchar(); 157 } 158 s[l]='\0'; 159 return; 160 } 161 162 int read(){ 163 int x=1,i=0; 164 char ch; 165 ch=getchar(); 166 while(!isdigit(ch)){ 167 if(ch==EOF){ 168 P(); 169 exit(0); 170 } 171 if(ch=='-')x=-1; 172 ch=getchar(); 173 } 174 while(isdigit(ch)){ 175 i=i*10+ch-'0'; 176 ch=getchar(); 177 } 178 return x*i; 179 } 180 181 182 int main(){ 183 freopen("yq.in","r",stdin); 184 freopen("yq.out","w",stdout); 185 init(); 186 // char a[123]="asad",b[12342]="qwqwee"; 187 // strcpy(a,b); 188 // printf("%s",a); 189 sort(E+1,E+1+sum); 190 // REP(i,1,sum){ 191 // printf("%s ",E[i].S); 192 // } 193 // printf("\n"); 194 while(1){ 195 int a; 196 a=read(); 197 if(a==0){ 198 get(query); 199 // printf("CNM"); 200 printf("%d\n",Q(query)); 201 } 202 else{ 203 get(query); 204 get(chan); 205 MMP(query,chan); 206 } 207 } 208 return 0; 209 }
最后%一下万能的达班长