题目: 老字号的店名都是从右往左念的,但随着时代的发展你想让你的店名被世界各地更多的人接受,所以你决定调整店名使得它从左往右念、从右往左念都是一样的。店名被简化表示为一个仅包含小写字母的字符串s,每次你能从当前字符串中选择一种字母,并将它们同时修改为另一类字母。问最少需要多少次修改达到目的(每修改1个字符记作1次)。
输入格式
输入仅一行,一个字符串s,表示你的老字号店名
输出格式
输出仅一行,表示最少修改次数,如果无法达到目的, 输出-1 。
输入样例
tongrentang
输出样例
5
#include <iostream>
#include <cstring>
#include <stack>
using namespace std;
int t,f[1000],fa[1000],cnt,ans,pat[1000];
stack<int>q;
string s;
int find(int n,int l){
if(fa[n]==n){
// cout<<n<<endl;
if(l==0){
q.push(s[n]);
}
return n;
}
else{
if(l==0){
q.push(s[n]);
}
return fa[n]=find(fa[n],l);
}
}
int main(){
cin>>s;
int p=s.length();
for(int i=0;i<s.length();i++){
f[s[i]-'0']++;
if(s[i]-'0'>t){
//cout<<s[i]<<endl;
t=s[i];
}
}
// cout<<t<<endl;
// cout<<t+'0'<<endl;
for(int i=1;i<=t;i++){
fa[i]=i;
}
for(int i=0;i<p;i++){
int fx=find(s[i],1);
int fy=find(s[p-1-i],1);
if(s[i]!=s[p-1-i]){
fa[fx]=fy;
}
}
int i=0;
int maxn=-1;
while(cnt!=p){
find(s[i],0);
while(!q.empty()){
int top=q.top();
q.pop();
// cout<<top<<endl;
if(f[top]>maxn){
maxn=f[top];
}
if(pat[top]==0){
cnt++;
pat[top]=1;
}
}
// cout<<"---"<<endl;
ans=ans+maxn;
i++;
}
cout<<ans;
return 0;
}
能改就提些意见吧,菜鸡刚学图论Tarjan都运用的不熟练