题意:给出一个数字n(1<=n<=2000000000),问最少删掉n中的几个数,能使得剩下的值变成平方数(不包括0)。
分析:为啥第一次错了呢?为啥比赛的时候wa了呢?因为我把0加进去了啊╮(╯_╰)╭
n最多10位数,化成字符形式一位位匹配过来就行了。我都不好意思说是构造……
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=200000+7;
int maxlen[20][20];
vector<string> s;
void sstr(long long t){
// s.push_back("0");
for(long long i=1;i<=sqrt(t);i++){
long long c=i*i;
string p;
// cout<<c<<endl;
while(c>0){
int a=c%10;
c=c/10;
char w=(char)((char)a+'0');
// cout<<a<<endl;
// cout<<w<<endl;
p+=w;
}
// cout<<p<<endl;
string b;
for(int i=p.size()-1;i>=0;i--){
b=b+p[i];
}
// cout<<b<<endl;
s.push_back(b);
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
string n;
cin>>n;
int len1=n.size();
sstr(2000000000);
memset(maxlen,0,sizeof(maxlen));
vector<string>::iterator it=s.begin();
int ans=0;
for(it=s.begin();it!=s.end();it++){
int len2=(*it).size();
if(len2>len1) break;
int temp=0;
int i=1;
int j=1;
//if(!(*it).compare("81")) cout<<len2<<endl;
while(i<=len1){
if(n[i-1]==(*it)[j-1]){
j++;
i++;
temp++;
//cout<<temp<<endl;
}
else{
i++;
}
}
if(temp==len2) ans=max(ans,temp);
}
// cout<<ans<<endl;
if(ans==0){
cout<<-1<<endl;
return 0;
}
cout<<n.size()-ans<<endl;
return 0;
}