题目意思: 有n个单词需要输入,第一个单词必须要动手输入。现在有两种命令,“repeat the last word”复制最后一个单词,“delete the last symbol”删除最后一个单词的最后一个字母。问我们最少需要动手输入几次
解题思路: 1:思路:排序+枚举每个单词
2:由于有了两种命令,copy最后一个单词和删除最后一个单词的最后一个字母,并且可以无限的使用,所以只要对这些单词排序,然后判断当前单词和上一个单词的关系即可
代码:
#include <algorithm> #include <iostream> #include <cstring> #include <string> #include <vector> #include <cstdio> #include <stack> #include <queue> #include <set> using namespace std; #define MAXN 110 int t , n , ans; string str[MAXN]; void solve() { int i , j , k; sort(str , str+n);//排序 ans = str[0].size(); for(i = 1 ; i < n ; i++){//枚举 if(str[i][0] != str[i-1][0]){ ans += str[i].size(); continue; } for(j = 0 , k = 0 ; j < str[i-1].size() ; j++ , k++){ if(str[i-1][j] != str[i][k]) break; } ans += str[i].size()-k; } printf("%d\n" , ans); for(i = 0 ; i < n ; i++) cout<<str[i]<<endl; } int main() { //freopen("input.txt" , "r" , stdin); scanf("%d" , &t); while(t--){ scanf("%d" , &n); for(int i = 0 ; i < n ; i++) cin>>str[i]; solve(); } return 0; }