Nguồn đề bài: http://www.spoj.com/PTIT/problems/P145PROI/
1. Đề bài P145PROI PTIT spoj
Một xâu ký tự được gọi là mật khẩu “an toàn” nếu xâu có độ dài ít nhất bằng 6 và xâu chứa ít nhất một chữ cái in hoa , một chữ cái thường , một chữ số .
Ví dụ, ‘a1B2C3’, ‘tinHoc6’ là hai mật khẩu “an toàn”. Còn ‘a1B2C’, ’a1b2c3’, ‘A1B2C3’, ‘tinHoc’ đều không phải là mật khẩu “an toàn”.
Một lần, Tí nhìn thấy một xâu S, chỉ gồm các loại ký tự: chữ cái in hoa, chữ cái thường và chữ số. Tí muốn tự kiểm tra khả năng đoán nhận mật khẩu bằng cách đếm xem có bao nhiêu cặp chỉ số (i, j) thỏa mãn điều kiện: 1 ≤ i < j ≤ length(S) và xâu con gồm các ký tự liên tiếp từ i đến j của S là mật khẩu “an toàn”.
Cho xâu S, các hãy tính số lượng cặp chỉ số (i, j) thỏa mãn điều kiện nêu trên.
Input
Một dòng chứa xâu S có độ dài <= 10^6.
Output
In ra một số nguyên duy nhất là số cặp chỉ số (i, j) tìm được.
Example
Test 1:
Input:
abc3456789PQ
Output:
6
Test 2:
Input:
abc123
Output:
0
2. Code tham khảo P145PROI PTIT spoj O(n)
program bt; uses math; const fi=''; nmax=1000000; var f:text; S:ansistring; n:longint; L:array[1..nmax+1,'1'..'3'] of longint; procedure docfile; var c:char; begin assign(f,fi); reset(f); s:=''; while not eoln(f) do begin read(f,c); case c of 'A'..'Z': s:=s+'3'; 'a'..'z': s:=s+'2'; '0'..'9': s:=s+'1'; end; end; close(f); n:=length(s); end; procedure taoL; var i:longint; j:char; begin for j:='1' to '3' do L[n+1,j]:=n+1; for i:=n downto 1 do begin L[i,'1']:=L[i+1,'1']; L[i,'2']:=L[i+1,'2']; L[i,'3']:=L[i+1,'3']; for j:='1' to '3' do if s[i]=j then L[i,j]:=i; end; end; procedure xuli; var i:longint; dem:int64; begin dem:=0; for i:=1 to n-5 do dem:=dem+n-max(max(i+5,L[i,'1']),max(L[i,'2'],L[i,'3']))+1; writeln(dem); end; begin docfile; taoL; xuli; // readln; end.
khai bao max là j z
#include
using namespace std;
int ktra(string s)
{ int n,i;
n=s.size();
bool hoa=false,thuong=false,so=false;
if(n<6) return false;
for(i=0;i=’a’)&&(s[i]=’A’)&&(s[i]=’0′)&&(s[i]<='9'))
so=true;
}
if((thuong==true)&&(hoa==true)&&(so==true))
return true;
}
string s,st;
int dem=0,i,j;
int main()
{ freopen("BAI3.INP","r",stdin);
freopen("BAI3.OUT","w",stdout);
getline(cin,s);
for(i=0;i<s.size();i++)
for(j=i;j<s.size();j++)
{st=s.substr(i,j-i+1);
if(ktra(st)==true)
dem++;
}
cout<<dem;
return 0;
}
mong ad ktra code nay giúp mình ạ