爱神丘比蛙 發表於 2019-11-6 20:20:00

(大模拟紫题) Luogu P1953 易语言

<p><img src="https://images.cnblogs.com/cnblogs_com/miserweyte/1543630/o_right.png" alt="本文作者MiserWeyte" loading="lazy"></p>
<p>原题链接:P1953 易语言</p>
<p><s>(我最近怎么总在做大模拟大搜索题)</s></p>
<p>分别处理两种情况。</p>
<h3 id="如果只有一个1或0">如果只有一个1或0</h3>
<p>直接设一个cnt为这个值,每次输入一个新名字之后把数字替换成cnt,最后cnt++即可。</p>
<p>注意数字可能不止一位,输出一次cnt之后可以整一个bool变量阻止以后的输出。</p>
<h3 id="如果是要改名">如果是要改名</h3>
<p>把名称和后缀分别存起来,扫一遍名称找出初始数字,赋给cnt。</p>
<p>同样,初始数字可能不止一位,要每次乘10加n。</p>
<p>然后不用管输入的是啥,每有一个输入输出一遍初始名称,数字部分替换成cnt即可。然后输出第二个名称时检测到小数点(误)直接输出后缀名之后break。每次循环后cnt++。</p>
<p><strong>然后就WA掉20分</strong></p>
<p>如果数字在后缀名末尾,这样会直接把第二个名称中的数字break掉。这时候之前整的那个bool变量就可以用了。如果数字输出没被阻止(即还没输出过数字),直接输出一次cnt就行。</p>
<p>源码:</p>
<pre><code class="language-cpp">//MiserWeyte is now "mzWyt"
#include &lt;bits/stdc++.h&gt;
using namespace std;
string opt1, opt2;
string name1, name2;
int main(){
        cin &gt;&gt; opt1;
        if(opt1 == '0' || opt1 == '1'){ // 只更换序号
                int cnt = opt1 - '0';
                while(cin &gt;&gt; name1 &gt;&gt; name2){
                        bool notend;
                        notend = true;
                        for(int i=0; i&lt;name1.length(); i++){ // 输入文件文件名
                                if(name1&gt;='0' &amp;&amp; name1 &lt;= '9'){ // 把数字部分替换为cnt
                                        if(notend){ // 防止数字部分有多位,只在第一位时输出一次
                                                cout &lt;&lt; cnt;
                                                notend = false;
                                        }
                                }
                                else cout &lt;&lt; name1;
                        }
                        cout &lt;&lt; ' ';
                        notend = true;
                        for(int i=0; i&lt;name2.length(); i++){ //输出文件文件名同上
                                if(name2&gt;='0' &amp;&amp; name2 &lt;= '9'){
                                        if(notend){
                                                cout &lt;&lt; cnt;
                                                notend = false;
                                        }
                                }
                                else cout &lt;&lt; name2;
                        }
                        cout &lt;&lt; '\n';
                        cnt ++;
                }
        }
        else{ // 更换名称
                cin &gt;&gt; opt2;
                int cnt = 0;
                for(int i=0; i&lt;opt1.length(); i++){ // 防止初始数字有多位
                        if(opt1 &gt;= '0' &amp;&amp; opt1 &lt;= '9'){
                                cnt *= 10;
                                cnt += opt1 - '0';
                        }
                }
                while(cin &gt;&gt; name1 &gt;&gt; name2){
                        bool notend;
                        notend = true;
                        for(int i=0; i&lt;opt1.length(); i++){ // 同只改数字的代码,只不过每次以opt1为模板
                                if(opt1 &gt;= '0' &amp;&amp; opt1 &lt;= '9'){
                                        if(notend){
                                                cout &lt;&lt; cnt;
                                                notend = false;                               
                                        }
                                }
                                else cout &lt;&lt; opt1;
                        }
                        cout &lt;&lt; ' ';
                        notend = true;
                        for(int i=0; i&lt;opt1.length(); i++){ //输出文件文件名
                                if(opt1 &gt;= '0' &amp;&amp; opt1 &lt;= '9'){
                                        if(notend){
                                                cout &lt;&lt; cnt;
                                                notend = false;                               
                                        }
                                }
                                else{
                                        cout &lt;&lt; opt1;
                                        if(opt1 == '.'){ // 点后面的直接替换成指定后缀
                                                cout &lt;&lt; opt2;
                                                break;
                                        }
                                }
                        }
                        if(notend) cout &lt;&lt; cnt; // 若还没输出过数字,则数字在后缀名后方,输出一次
                        cout &lt;&lt; '\n';
                        cnt ++;
                }
        }
        return 0;
}
</code></pre>


</div>
<div id="MySignature" role="contentinfo">
    <br>
<div align="center"><img alt="知识共享许可协议" style="border-width: 0" src="https://images.cnblogs.com/cnblogs_com/miserweyte/1543630/o_20052616135188x31.png"><br>本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。</div><br><br>
来源:https://www.cnblogs.com/xxu-mzwyt/p/11808381.html
頁: [1]
查看完整版本: (大模拟紫题) Luogu P1953 易语言