Codeforces 1144 E. Median String

原题链接:https://codeforces.com/problemset/problem/1144/E

tag:字符串模拟,大整数。

题意:给定两个字符串,求字典序中间串。

思路:可以把这个题当做一个26进制数的模拟。a~z分别代表0~25,然后求平均,在通过数字反求字符串。

然后写出这么个代码

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned long long ll;
 4 ll _input(ll);
 5 void _output(ll,ll);
 6 int main()
 7 {
 8     ll n;
 9     cin>>n;
10     ll num1,num2;
11     num1=_input(n);
12     num2=_input(n);
13     ll res=0;
14     res=(num1+num2)/2;
15     _output(res,n);
16     cout<<endl;
17     return 0;
18 }
19 ll _input(ll n)
20 {
21     ll re=0;
22     char a;
23     for(ll i=0;i<n;i++)
24     {
25         cin>>a;
26         re=re*26+(a-'a');
27     }
28     return re;
29 }
30 void _output(ll res,ll n)
31 {
32     stack<char> qq;
33     while(n--)
34     {
35         qq.push('a'+res%26);
36         res/=26;
37     }
38     while(qq.size())
39     {
40         cout<<qq.top();
41         qq.pop();
42     }
43 }
View Code

然后你就可以很快的wa了。

???

好吧,想着总不能爆掉我的unsigh long long 吧,然后打脸了。 26^10000,,,,随便爆。。

于是乎只能用数组模拟,一来可以方便的表示26进制,二来也可以表示很大的数据,爆不掉(除非非常非常变态了)

代码如下

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[1000005];
 4 int main()
 5 {
 6     int n;
 7     cin>>n;
 8     string c,b;//储存字符串
 9     cin>>c;
10     cin>>b;
11     for(int i=n-1;i>=0;i--)       //模拟加法
12     {
13         a[i+1]+=c[i]-'a'+b[i]-'a';  //从a[1]开始存,a[0]留着进位用。
14         a[i]+=a[i+1]/26;        //给高一位先进位
15         a[i+1]%=26;           //当前位对26取模。
16     }
17     char e;
//模拟除法
18 e='a'; 19 if(a[0]>=2)cout<<char(e+a[0]/2);   20 if(a[0]%2!=0)a[1]+=26;      //看最高位是否存在进位的,如果存在,退回来。 21 for(int i=1;i<=n;i++) 22 { 23 e='a'; 24 cout<<char(e+a[i]/2);    //输出当前位除2所表示的数。 25 if(a[i]%2!=0)a[i+1]+=26;  //剩下的退回下一位。 26 } 27 cout<<endl; 28 return 0; 29 }

猜你喜欢

转载自www.cnblogs.com/greenpepper/p/10645298.html
今日推荐