字符串比较,可以用Set可以用字典树
题目
好像可以用字典树,之后学一学
set小根、迭代器、指针相关知识也需要时常牢记下来相关知识字典树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include<bits/stdc++.h> using namespace std; #define maxn 500010 #define MOD 998244353 #define ll long long #define endl '\n' int n; string s[maxn]; set<string> s1; set<string,greater<string> > s2; map<string,int> m; int main() { cin>>n; s1.insert("`"),s2.insert("`"); s1.insert("{"),s2.insert("{"); for(int i=1;i<=n;i++){ cin>>s[i]; s1.insert(s[i]); s2.insert(s[i]); m[s[i]]++; } for(int i=1;i<=n;i++){ if(m[s[i]]>=2){ cout<<s[i].length()<<endl; continue; } s1.erase(s[i]); s2.erase(s[i]); set<string>::iterator f1d=s1.lower_bound(s[i]); set<string>::iterator f2d=s2.lower_bound(s[i]); string f1=*f1d; string f2=*f2d; int ans1=0,ans2=0; if(f1!="{"){ for(int j=0;j<min(s[i].length(),f1.length());j++){ if(f1[j]!=s[i][j]) break; ans1++; } } if(f2!="`"){ for(int j=0;j<min(s[i].length(),f2.length());j++){ if(f2[j]!=s[i][j]) break; ans2++; } } cout<<max(ans1,ans2)<<endl; s1.insert(s[i]); s2.insert(s[i]); } return 0; }
|