模拟赛爆零记

  今天打模拟赛,又爆零啦,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 }

最后%一下万能的达班长

转载于:https://www.cnblogs.com/MakiseKurisuLab004/p/8387321.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值