鏈接:https://www.nowcoder.com/acm/contest/148/J
來源:牛客網
時間限制:C/C++ 2秒,其他語言4秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
Sometimes you may want to write a sentence into your nickname like "lubenwei niubi". But how to change it into a single word? Connect them one by one like "lubenweiniubi" looks stupid.
To generate a better nickname, Rikka designs a non-trivial algorithm to merge a string sequence s1...sn into a single string. The algorithm starts with s=s1 and merges s2...sn into s one by one. The result of merging t into s is the shortest string r which satisfies s is a prefix of r and t is a subsequence of r.(If there are still multiple candidates, take the lexicographic order smallest one.)
String s is a prefix of r if and only if |s| ≤ |r| and for all index i ∈ [1, |s|], si = ri.
String s is a subsequence of r if and only if there is an index sequence which satisfies .
For example, if we want to generate a nickname from "lubenwei niubi", we will merge "niubi" into "lubenwei", and the result is "lubenweiubi".
Now, given a sentence s1...sn with n words, Rikka wants you to calculate the resulting nickname generated by this algorithm.
輸入描述:
The first line contains a single number t(1 ≤ t ≤ 3), the number of testcases.
For each testcase, the first line contains one single integer n(1 ≤ n ≤ 106).
Then n lines follow, each line contains a lowercase string .
輸出描述:
For each testcase, output a single line with a single string, the result nickname.
示例1
輸入
2
2
lubenwei
niubi
3
aa
ab
abb
輸出
lubenweiubi
aabb
題解:從第一個字符串開始,第二個字符串以順序的方式融入前一個字符串,融不進的就把剩下的字符串添加在總字符串尾;
很簡單,想複雜了怎麼也搞不出來;
tips:string定義的字符串變量可以直接加;
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,n;
string s,s1;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
cin>>s;
for(int i=1;i<n;i++)
{
cin>>s1;
int k=0,j=0;
while(s[j]&&s1[k])
{
if(s[j]==s1[k])
{
k++;
}
j++;
}
while(s1[k])
{
s+=s1[k];//s字符串變量可以用加的方式把字符直接加在末尾
k++;
}
s1="";//定義s1字符串爲空
}
cout<<s<<endl;
}
}